Informática Numaboa - Tutoriais e Programação

Cap. VI - Caixas de Diálogo

Qui

20

Dez

2007


08:03

  • Imprimir
(5 votos, média 4.20 de 5) 


Nível Intermediário

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:

Vídeo 1
prog13.exe

vovo 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:

Biblioteca user32.lib DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL

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:
    Propriedades
    Fig. 1

    A ID da nossa caixa é 101 e o nome é IDD_DIALOG1. Estes dados devem ser declarados no nosso arquivo INC, na seção const:
    Declarações
    Fig. 2

  • 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.

Vídeo 2
prog14.exe

vovo 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:

mov eax,wParam mov edx,eax shr edx,16 .IF dx==BN_CLICKED .if ax == botao01 .elseif ax == botao02 .endif .ENDIF

SHR (deslocamento para a direita) Destino Contador

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:

mov eax,12345678 shr eax,16 Equivale a: Contador = 16 12345678h : 2^16 (2 elevado a 16) 12345678h : 10000h = 00001234 EAX = 00001234

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.

mov eax,wParam ; EAX = 00003E9h mov edx,eax ; Movemos o conteúdo de EAX para EDX = 00003E9h shr edx,16 ; EDX = 00000000 .IF DX==BN_CLICKED ; Compara se DX é igual a ZERO .endif

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:

Vídeo 3
prog15.exe

vovo Para assistir ao vídeo, faça o download de prog15.exe.

Biblioteca user32.lib GetDlgItemText,hWin,edit01,addr buffer,225

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.
Biblioteca user32.lib SetDlgItemText,hWin,edit01,addr buffer

É 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:

Vídeo 4
prog16.exe

vovo Para assistir ao vídeo, faça o download de prog16.exe.

Biblioteca user32.lib SendMessage,hWin,edit01,addr buffer

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:

SendMessage, hWin - Manipulador da janela. WM_SETICON - Tipo de mensagem. ICON_BIG - Tamanho do ícone. hIcone - handle do ícone.

Se quisermos fechar nossa janela principal, um dos vários métodos seria enviar a mensagem WM_CLOSE. Exemplo:

SendMessage, hWin - Manipulador da janela. WM_CLOSE - Tipo de mensagem. 0 - Não especificamos. 0 - Não especificamos.

Faremos mais um exemplo com esta função. Para tanto, criamos um programa igual à esta imagem:

Dois botões
Fig. 3

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:

.elseif eax==WM_COMMAND mov edx,wParam .if edx == botao01 invoke SendMessage,hWin,WM_COMMAND,boton02,0 .elseif edx == botao02 invoke SendMessage,hWin,WM_CLOSE,0,0 .endif .elseif eax==WM_CLOSE invoke EndDialog,hWin,0

No botao01 colocamos a função SendMessage, declarada da seguinte forma:

hWin - Manipulador da janela. WM_COMMAND - Este tipo de mensagem é onde se produzen as funções dos botões. botao02 - Especificamos o valor que deve ter wParam quando enviamos a mensagem. 0 - Não especificamos nada.

Este exemplo é muito resumido e está junto com este documento.


Exercícios

  1. 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):
    Exercício 1
  2. 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:
    Calculadora
  3. 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


Julho-2006
Copyright(c) 2005-2006 RVLCN



Recado da vó vovo

Aqui está o código fonte dos exercícios deste tutorial:



mfxbroker.comкастрюля керамическая купитьсайт nikas ноутбуки популярныеnikas отзывникаслобановский александр