|
Página 1 de 7 
Masm32+RadASM
Capítulo V: Nossa primeira janela
Escrito por: ^A|An M0r3N0^
Conselheiro: RedH@wk
Tradução: ~Uglinho~
O presente texto foi escrito para fins educacionais e de pesquisa e é de livre distribuição contanto que se preserve o conteúdo e os direitos do autor.
Nossa primeira janela
Chegou o momento de criar aplicações com janelas e adicionar botões, imagens e outros controles.
Primeiro criaremos uma janela feita com APIs puras, como mostra o vídeo. Preste muita atenção:
 prog009.exe
Para assistir ao vídeo, faça o download de prog009.exe.
Biblioteca kernel32.lib
GetModuleHandle, NULL
Esta função devolve o handle do módulo ou instância do programa. Todos os programas que utilizam janelas utilizam esta função, então guardamos o valor devolvido para EAX numa variável que, neste caso, se chama Hinstance:
mov Hinstance,eax
Depois precisamos utilizar a estrutura WNDCLASSEX que contém toda informação requerida para criar nossa janela. Colocamos essa informação com a instrução MOV e, para utilizá-la, declaramos a etiqueta wc como WNDCLASSEX desta maneira:
wc WNDCLASSEX <>
Se buscarmos ajuda no Win32 Programmer's Reference para saber sobre cada elemento da estrutura, ela mostrará o seguinte:
typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;
- cbSize - é aqui que especificamos o tamanho da estrutura. Quando não sabemos o tamanho, utilizamos o operador SIZEOF:
mov wc.cbSize, SIZEOF WNDCLASSEX
- style - especificamos o estilo da nossa janela. Há vários tipos (ver a ajuda antes mencionada) como, por exemplo, os que utilizamos: CS_HREDRAW e CS_VREDRAW. Se quisermos combiná-los podemos utilizar a instrução OR:
mov wc.style, CS_HREDRAW or CS_VREDRAW
- lpfnWndProc - definimos o endereço da etiqueta dos procedimentos:
mov wc.lpfnWndProc, offset WinProC
- cbClsExtra - especificamos o número de bytes extras para localizar a estrutura da janela, mas nós não a utilizamos e movemos
o valor zero ou NULL:
mov wc.cbClsExtra,NULL
- cbClsExtra - especificamos o número de bytes extras para localizar a instância da janela. Como no anterior, não precisaremos dele e movemos o valor zero.
mov wc.cbWndExtra,NULL
- hInstance - especificamos o manipulador (handle) da instância do módulo:
push Hinstance
pop wc.hInstance
- hIcon - especificamos o manipulador do ícone. Para isto utilizamos a função LoadIcon:
invoke LoadIcon,Hinstance,IDI_APPLICATION
mov wc.hIcon,eax
- hCursor - especificamos o manipulador de cursor. Para isto utilizamos a função LoadCursor:
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
- hbrBackground - especificamos a cor de fundo da nossa janela:
mov wc.hbrBackground, COLOR_BTNFACE + 1
- lpszMenuName - especificamos o manipulador do Menu.
mov wc.lpszMenuName,NULL
- lpszClassName - definimos o endereço da etiqueta onde se encontra o nome (ASCII) da classe da janela.
mov wc.lpszClassName,offset Classname
- hIconSm - especificamos o manipulador de ícone pequeno.
|