Informática Numaboa - Tutoriais e Programação
Cap. VI - Caixas de Diálogo
Qui 20 Dez 2007 08:03 |
- Detalhes
- Categoria: MASM + RadASM
- Atualização: Quinta, 18 Junho 2009 11:26
- Autor: Alan Moreno
- Acessos: 9639
Masm32+RadASM
Capítulo VI: Caixas de Diálogo
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.
Caixas de Diálogo
Esta é uma outra maneira de criar janelas. Utilizando o editor de recursos que vem com o RadASM pode-se criá-las de forma fácil e rápida. Vejamos o seguinte vídeo:
Para assistir ao vídeo, faça o download de prog13.exe.
Como observamos no vídeo, o código para mostrar uma janela simples utilizando as caixas de diálogo é mais curto do que quando o fazemos com APIs puras. Vejamos o código do arquivo prog13.inc:
Esta é a função principal do nosso programa porque é a responsável por mostrar a janela que está nos recursos. Além disto, ela indica o endereço onde se encontram seus processos. Vejamos para que serve cada um dos parâmetros:
- hInstance - especificamos o manipulador da instância do módulo.
- lpTemplate - especificamos a ID da nossa caixa de diálogo. Podemos determinar esta ID nas propriedades da caixa:
A ID da nossa caixa é 101 e o nome é IDD_DIALOG1. Estes dados devem ser declarados no nosso arquivo INC, na seção const:
- hWndParent - definimos o handle ao qual pertence a janela. Aqui colocamos NULL porque nossa janela é a principal. Caso fosse a segunda janela, especificaremos o handle da primeira janela (mãe).
- lpDialogFunc - definimos o endereço da etiqueta onde se encontram os procedimentos:
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM mov eax,uMsg .if eax==WM_INITDIALOG .elseif eax==WM_COMMAND .elseif eax==WM_CLOSE invoke EndDialog,hWin,0 .else mov eax,FALSE ; movemos para EAX o valor 0 para reciclar as mensagens que não ; utilizamos. Se não fizermos isto, não será ;compatível com windows XP e NT ret .endif mov eax,TRUE ret DlgProc endp Como observamos, este procedimento nos é familiar pois é parecido com os processos das janelas feitas com APIs puras que criamos no capítulo anterior. Toda janela gerencia as mesmas mensagens, com exceção de algumas que são apenas para Dialog. Por exemplo, a mensagem WM_INITDIALOG é enviada antes de mostrar a caixa de diálogo no desktop. Como diferenciamos as mensagens que são apenas para caixas de diálogo? Simples, porque no final da mensagem aparece a palavra DIALOG. - dwInitParam - definimos o valor inicial que queremos para o parâmetro lParam. Como isto não será usado, colocamos o valor NULL.
Vamos continuar praticando e, desta vez, criaremos uma janela com 2 botões que terão funções diferentes. O primeiro botão será para mostrar uma mensagem e o segundo será para sair.
Para assistir ao vídeo, faça o download de prog14.exe.
Já vimos no capítulo V em que momento se envia a mensagem WM_COMMAND. Se não tiver lido, o conceito está na página 12 quando trabalhamos com caixas de diálogo e seus controles (e itens). Sempre os identificamos com uma ID e, sempre que quisermos trabalhar com um controle específico, o identificamos através da ID. A constante que guarda todas as IDs de controle no processo da janela é wParam. Além de lembrar que ela contém o código de notificação, para que fique bem claro, observem o seguinte quadro:
wParam | lParam | ||
HIGH | LOW | ||
CONTROLES (botões, edit, etc) | Contém o código de notificação | Contém a ID | Contém o manipulador da janela filha (handle) |
MENU | Sem utilidade | Contém a ID | Sem utilidade |
Exemplo - suponhamos que wParam contenha o valor 12345678. Neste caso o código de notificação é 1234 e a ID é 5678.
Este é um exemplo de como extrair o código de notificação:
A instrução SHR troca os bits de lugar deslocando-os para a direita. Os bits mais significativos desaparecem e as posições criadas à esquerda são preenchidas com 0.
Para não nos atrapalharmos com esta instrução, basta saber que ela é igual a dividir por 2 elevado ao Contador. Exemplo:
Desta maneira podemos obter o código de notificação se quisermos trabalhar com ele.
BN_CLICKED - este código de notificação é enviado quando clicamos em qualquer botão. Eu não o utilizo porque este valor de notificação tem 0 na esquerda. Por exemplo, a ID do botao01 é 1001 em decimal (03E9 em hexa). Quando clicamos o botao01, o valor de wParam será igual a 000003E9h onde o código de notificação, igual a BN_CLICKED, é 0000 e a ID é 03E9.
Comparamos se o valor do código de notificação é igual a 0. É por isto que evito todo este código e prefiro comparar as IDs porque sei que o código de notificação, quando clicamos, é 0 e está no lado esquerdo do nosso valor total. Como dizem, zero à esquerda não serve - exceto se, no nosso programa, quisermos utilizar o código de notificação e associá-los a funções para todos os botões.
Continuando, vamos trabalhar com alguns campos editáveis:
Para assistir ao vídeo, faça o download de prog15.exe.
Esta função trabalha com caixas de diálogo. É igual à função GetWindowText com a diferença de que, para obter o texto do controle, necessitamos do manipulador da nossa caixa de diálogo e da ID do controle do qual queremos o texto. Parâmetros:
- hDlg - especificamos o manipulador da caixa de diálogo.
- nIDDlgItem - especificamos a ID do nosso Controle.
- lpString - endereço de memória para armazenar o texto.
- nMaxCount - número máximo de caracteres que se vai pegar.
É como a função SetWindowText, que insere texto, mas com a diferença de que especificamos a ID do controle. Parâmetros:
- hwndDlg - especificamos o manipulador da caixa de diálogo.
- idControl - identificamos a ID do nosso Controle.
- lpsz - endereço de memória onde se encontra o texto.
Agregando um Ícone
Agora agregaremos um ícone à nossa aplicação:
Para assistir ao vídeo, faça o download de prog16.exe.
Esta função envia mensagens específicas para as nossas janelas sempre e enquanto tivermos o manipular da janela. Parâmetros:
- hwnd - identificamos o manipulador da janela à qual enviaremos a mensagem.
- uMsg - especificamos a mensagem a ser enviada.
- wParam - especificamos informação adicional da mensagem.
- lParam - especificamos informação adicional da mensagem.
Por exemplo, se quisermos enviar um ícone à nossa janela, especificamos o manipulador da janela, o tipo de mensagem, o tamanho do ícone e o manipulador do ícone.
Foi desta forma que declaramos a função SendMessage para enviar um ícone ao nosso programa:
Se quisermos fechar nossa janela principal, um dos vários métodos seria enviar a mensagem WM_CLOSE. Exemplo:
Faremos mais um exemplo com esta função. Para tanto, criamos um programa igual à esta imagem:
Estes dois botões fecham a janela e seu funcionamento é o seguinte: o primeiro botão envia uma mensagem para a janela para que execute a função do botão 2 que, por sua vez, envia uma mensagem para encerrar o programa.
Você deve estar se perguntando como isto é feito. O fazemos com o seguinte código:
No botao01 colocamos a função SendMessage, declarada da seguinte forma:
Este exemplo é muito resumido e está junto com este documento.
Exercícios
- Crie um programa que, quando o botão "enviar" for pressionado, mostre uma mensagem com o texto que pusemos no campo de edição (como mostra a imagem):
- Crie uma claculadora que some dois valores. Deve ter 3 campos de edição onde:
O primeiro e segundo campos de edição recebem os valores que serão somados.
O terceiro campo de edição mostrará o resultado.
Além disto, devem existir 3 botões com as seguintes funções:
O primeiro botão deve fazer a soma.
O segundo botão deve limpar todos os campos de edição.
O terceiro botão fecha a janela.
Para desenvolver este programa é necessário usar o seguinte:
1. As funções atodw e dwtoa, descritas no capítulo III.
2. Você deve usar a instrução add (soma).
Se pede o resultado em decimais. A idéia é algo parecido com:
- Desenvolva um programa que converta números decimais em hexadecimais.
Você pode combinar as funções do masm32 atodw, dwtoa e dw2hex ou usar uma única função que é a wsprintf.
Lembrando
Não esquecer de perguntar na lista MASM32-RadASM. As soluções destes exercícios serão enviados para a lista dentro de uma semana. Vocês também podem enviar suas prórias soluções.
Se tiverem dúvidas, sugestões ou outros, faça-as na lista de discussão.
O autor pode ser contactado
eMail: O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo. ou O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.
Lista de discussão MASM32-RadASM
http://groups.google.es/group/MASM32-RadASM
www
Copyright(c) 2005-2006 RVLCN
Recado da vó
Aqui está o código fonte dos exercícios deste tutorial: