A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Dialog Box (masm)

Ter

21

Abr

2009


14:30

(3 votos, média 3.67 de 5) 


Gerenciando o fechamento da janela

Já que o fechamento da janela é possível de ser obtido através do item de manu "Sair", podemos aproveitar o código para fechar a janela quando o usuário clica no canto superior direito da janela no botãozinho [x]. Este botãozinho envia uma mensagem do tipo WM_CLOSE:

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg == WM_INITDIALOG invoke GetDlgItem, hWnd, IDC_EDIT invoke SetFocus, eax .IF uMsg == WM_CLOSE invoke SendMessage, hWnd, WM_COMMAND, IDM_sair, 0 .ELSEIF uMsg == WM_COMMAND ...

Gerenciando os botões

Vimos acima que o parâmetro lParam identifica o remetente se a mensagem for de um controle. Caso contrário, o valor é NULL. Nossos botões são controles, então, as mensagens enviadas por eles terão lParam diferente de NULL. Acontece que precisamos do código de notificação dos botões para testar o evento (clique, duplo clique, etc) e este código se encontra no word mais significativo de wParam. Já vimos que, para obter o word menos significativo, basta transferir o valor de 32 bits para um registrador (EAX, por exemplo) e trabalhar com os primeiros 16 bits usando "meio" registrador (AX, por exemplo). Para acessar os 16 bits mais significativos precisamos usar um expediente: deslocar os bits da esquerda para a direita em 16 posições. A instrução que produz este deslocamento é a SHR (shift right - deslocamento para a direita). Usaremos o registrador EDX para efetuar o deslocamento e depois utilizaremos DX para obter o código de notificação (de 16 bits).

Quando o botão com "Diga Oi" for acionado, queremos que o texto da caixa de edição seja preenchido com "Viu só? O gerente funcionou" que, claro, precisa ser declarado e inicializado na seção .DATA. Quando o botão "Sair" for acionado, aparece a caixa de mensagem com "Tchauzinho" e a janela de diálogo é fechada.

... .DATA NomeClasse db "DLGNumaBoa",0 TituloJanela db "O que o gerente fez",0 Adeus db "Tchauzinho",0 StringTeste db "Viu só? O gerente funcionou",0 ... .ELSEIF uMsg == WM_COMMAND mov eax, wParam .IF lParam == NULL .IF ax == IDM_pegar invoke GetDlgItemText, hWnd, IDC_EDIT, ADDR buffer, 512 invoke MessageBox, hWnd, ADDR buffer, ADDR TituloJanela, MB_OK .ELSEIF ax == IDM_pegar invoke SetDlgItemText, hWnd, IDC_EDIT, NULL .ELSEIF ax == IDM_sair invoke MessageBox, hWnd, ADDR Adeus, ADDR TituloJanela, MB_OK invoke EndDialog, hWnd, NULL .ENDIF .ELSE mov edx, wParam shr edx, 16 .IF dx == BN_CLICKED // botão clicado? .IF ax == IDC_BUTTON invoke SetDlgItemText, hWnd, IDC_EDIT, ADDR StringTeste .ELSEIF ax == IDC_EXIT invoke SendMessage, hWnd, WM_COMMAND, IDM_sair, 0 .ENDIF .ENDIF .ENDIF ...

O valor de retorno do gerente de mensagens de uma janela de diálogo

Você viu na rotina do gerente de mensagens de uma janela "normal", quando nenhuma mensagem é interceptada, é preciso redirigir a mensagem para o procedimento padrão do sistema com invoke DefWindowProc, hWnd, uMsg, wParam, lParam. Numa janela de diálogo, em princípio, é preciso fazer a mesma coisa - chamar o procedimento padrão. A diferença é a seguinte: não substituímos o gerente de diálogos, apenas o contratamos. Ele está "de serviço" e não precisamos chamá-lo através de uma função. É suficiente indicar para ele se nós já processamos a mensagem ou não, e isso é possível fazer com TRUE (verdadeiro) ou FALSE (false). Também sabemos que o registrador oficial para valores de retorno é o EAX. Então EAX = TRUE significa que processamos a mensagem; EAX = FALSE significa que a mensagem não foi processada e o gerente precisa tomar as devidas providências.

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg == WM_INITDIALOG ... .ELSEIF uMsg == WM_CLOSE ... .ELSEIF uMsg == WM_COMMAND ... .ELSE mov eax, FALSE ret .ENDIF mov eax, TRUE ret gerenteMensagem endp

Finalmentes

Mais um tutorial do tamanho de um bonde! Mas é assim mesmo. Toda vez que se discute um assunto em detalhes, a conversa fica longa. Escreva e compile seu código. O resultado obtido deve ser este:

Diálogo

Como sempre, você pode fazer o download do tutorial ou visitar a seção de downloads / tutoriais / assembly numaboa para baixar a coleção completa.

Abraços a todos da vó Vicki vovo

игровой автомат resident резидент онлайн бесплатноnikasrestaurant.comресторан никас фото yeellafb consultkontur-yamal.ru сайты отзывов

Informações adicionais