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

Cap. VI - Caixas de Diálogo

Qui

20

Dez

2007


08:03

(5 votos, média 4.20 de 5) 


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.

Informações adicionais