quarta-feira, 13 de março de 2013

ScreenShot com wxWidgets

Hoje vamos ver como podemos tirar um screenshot usando wxWidgets.

Em primeiro lugar vamos ver quais as classes que usaremos para isso:

O wxWidgets trabalha com alguns tipos de DC ou Device Context, cada um deles é responsável por selecionar um determinado objeto para que possamos desenhar ou obter informações de imagem, um dos Dcs que já expliquei por aqui foi o wxPaintDC, com ele, selecionamos um objeto derivado de wxWindow e podemos desenhar nesse objeto, hoje vamos ver outros dois Dcs, o wxScreenDC, que seleciona a tela do Desktop, fazendo com que possamos convertê-la em imagem, depois usaremos o wxMemoryDC que seleciona um wxBitmap e consegue desenhar no mesmo.

Vamos criar uma função chamada GetScreenShot que vai nos retornar um wxBitmap:

wxBitmap GetScreenShot()
{

	wxSize mSize = wxGetDisplaySize();

	wxBitmap mBmp = wxBitmap(mSize.x, mSize.y);

	wxMemoryDC mDC(mBmp);

	wxScreenDC sDC;

	mDC.Blit(0, 0, mSize.x, mSize.y, &sDC, 0, 0);

	mDC.SelectObject(wxNullBitmap);

	return mBmp;

}

Na linha 1 temos a declaração da função.

Na linha 4 pegamos o tamanho do nosso Desktop, incluindo a área do painel, usando a função wxGetDisplaySize() que me retornará um wxSize.

Na linha 6 criamos um wxBitmap com as dimensões da nossa Área de Trabalho.

ha 8 criamos o wxMemoryDC passando como parâmetro o wxBitmap, ele será responsável por plotar a imagem da Área de Trabalho em nosso bitmap.

Na linha 10 criamos o wxScreenDC, ele será responsável por pegar a imagem da Área de Trabalho, ele fará isso automaticamente.

Em 12 temos a parte mais complicada da função, é quando plotamos a imagem da área de trabalho no bitmap usando a função Blit.

Os parâmetros da função Blit que usaremos aqui são:

O primeiro e o segundo parâmetros são usados para passar a posição inicial do bitmap onde queremos desenhar, aqui uso 0 e 0 pois quero que a Área de Trabalho seja plotada iniciando nessas coordenadas.

O terceiro e quarto parâmetros são a altura e largura que irei usar na plotagem, no caso o tamanho total da área de trabalho.

O quinto parâmetro é um ponteiro para o DC que quero “colar” na imagem, no caso o wxScreenDC com a imagem da nossa Área de Trabalho.

O sexto e o sétimo parâmetros definem a partir de qual ponto do DC que estamos plotando será iniciado o processo, aqui eu usei 0 e 0 mais uma vez pois quero a área total do mesmo.

Na linha 14 removo o mBmp do controle do wxMemoryDC.

E em 16 finalizo retornando o mBmp na função.

Vejam que com poucas linhas conseguimos obter um ScreenShot da nossa área de trabalho.

Para testar a função:

class wxAppSS : public wxApp
{
    public:
        virtual bool OnInit(void);
};

bool wxAppSS::OnInit(void)
{
    wxInitAllImageHandlers();
    GetScreenShot().SaveFile(wxT("test.png"), wxBITMAP_TYPE_PNG);
    return false;
}

IMPLEMENT_APP(wxAppSS)
Resultado Final no Mint/Linux

0 comentários:

Postar um comentário