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 |