Construindo um Screen Saver Usando Somente a API do Windows
Os passos básicos para construir um screen saver “na raça” são:
- Analisar a linha de comando (parâmetro lpCmdLine de WinMain), para detectar qual a operação desejada (configuração, preview, alteração de senha ou operação normal).
- Se a operação for configuração ou alteração da senha, mostrar o diálogo correspondente e encerrar.
- Criar a janela onde será feito o screen saver. No caso de preview, esta janela está limitada uma pequena parte da tela, na operação normal esta janela ocupa a tela toda. Uma vez criada a janela, toda a ação passa a ser na respectiva rotina de janela:
- Na mensagem de criação da janela (WM_CREATE) são feitas as iniciações. Normalmente é criado um timer, para gerar periodicamente uma mensagem WM_TIMER.
- Na mensagem WM_TIMER a tela é atualizada.
- As mensagens WM_KEYDOWN, WM_ACTIVATE. WM_ACTIVATEAPP, WM_NCACTIVATE, WM_LBUTTONDOWN, WM_MBUTTONDOWN e WM_RBUTTONDOWN solicitam o fechamento da janela.
- No tratamento da mensagem WM_SETCURSOR o ponteiro do mouse deve ser apagado na operação normal (desde que não esteja sendo apresentado o diálogo de senha).
- No tratamento da mensagem WM_MOUSEMOVE é verificado se o mouse se moveu mais que uma certa tolerância. Em caso afirmativo, é solicitado o fechamento da janela.
- No tratamento da mensagem WM_CLOSE é solicitada a senha. Uma cortesia adicional ao usuário é só pedir a senha alguns segundos após o início da execução do screen saver. Desta forma, se o usuário está na frente do micro ele pode abortar o screen saver sem digitar a senha.
- Por último, a mensagem WM_DESTROY é usada para fazer a limpeza final (como destruir o timer) e encerrar o programa.
Para facilitar a construção de screen savers, a Microsoft desenvolveu uma biblioteca que já contem parte do código necessário. Para gerar um screen saver usando a biblioteca é necessário:
- linkar Scrnsave.lib ao programa;
- escrever três rotinas: ScreenSaverProc, ScreenSaverConfigureDialog e RegisterDialogClasses; e
- definir nos resources um ícone, a descrição do screensaver e o diálogo de configuração.
As rotinas que devem ser implementadas são:
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Esta rotina é a rotina de janela da janela usada para apresentar a imagem do screen saver. As mensagens não tratadas devem ser passadas para a rotina DefScreenSaverProc da biblioteca, que cuida de esconder o cursor e de terminar o screen saver quando necessário.
Tipicamente esta rotina trata as mensagens WM_CREATE (para realizar iniciações, como criar um timer), WM_TIMER (para atualizar a tela) e WM_DESTROY (para liberar recursos, como o timer)
BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Esta rotina é a rotina de diálogo do diálogo de configuração. Este diálogo é criado automaticamente pela biblioteca.
BOOL WINAPI RegisterDialogClasses (HINSTANCE hInst)
Esta rotina é chamada pela biblioteca para permitir registrar classes não padrões utilizadas pelo screen saver. A rotina deve retornar TRUE em caso de sucesso.
Os resources que devem ser criados são:
- Um ícone, com identificador ID_APP (definido em Scrnsave.h como 100);
- Um string resource com identificador IDS_DESCRIPTION (definido em Scrnsave.h como 1), contendo o nome do screen saver; e
- O template do diálogo de configuração, com identificador ID_SCRNSAVECONFIGURE (definido em Scrnsave.h como 2003).
Nenhum comentário:
Postar um comentário