oicìliS © - Assembly para Iniciantes
(ver 1.0 de 05.02.02)

MENUS

 

Neste tutorial vamos explorar um pouco mais os recursos, focalizando especificamente os menus.

 

PROJETO MENUS

 

Como sempre, nosso primeiro passo é planejar nosso programa:

  1. Sobre os Menus
  2. A sintaxe do recurso menu
  3. Exemplo de recurso menu
  4. Menu padrão da classe
    1. Adicionando um menu padrão à classe
  5. Menu específico do objeto
    1. Adicionando um menu específico ao objeto
  6. Gerenciando a seleção de itens
  7. Janela com menu padrão
  8. Atélogo e Download de um exemplo
1. SOBRE OS MENUS

 

O menu é um dos componentes mais importantes da sua janela pois apresenta uma lista de serviços que seu programa oferece aos usuários. Por mais que se queira inovar, os usuários já se acostumaram com um "padrão" de menu universalmente aceito: precisa ter como primeiro item [Arquivo] - [File], com os recursos de abrir, salvar, salvar como, imprimir, sair, etc, e como último item [Ajuda] - [Help]. Geralmente o segundo item é [Editar] - [Edit], com as opções de copiar, colar, procurar, etc. Quanto mais simples, mais eficiente será o menu. Procure indicar com reticências (...) se o item chamar uma caixa de diálogo e não se esqueça de adicionar as teclas de atalho que correspondem a cada item (se houver).

 

Menus são um tipo de recurso. Já vimos no tutorial "Usando Recursos" que existem vários tipos de recursos como ícones, bitmaps, diálogos, menus, etc. Os recursos são descritos num arquivo em separado, o chamado arquivo de recursos, geralmente com a extensão .rc. Também já vimos que existe uma linguagem própria para descrever os recursos, a "Resource Script Language". Podemos usar`qualquer editor de texto para escrevê-los. Os arquivos de recursos precisam ser compilados e depois combinados com o código fonte do seu programa na fase de linkedição.

 

Um recurso menu define a aparência e a funcionalidade de um menu.

 

2. A SINTAXE DO RECURSO MENU

 

Inicialmente defina o nome, o tipo e a área que conterá as características do recurso:

meuMenu MENU

{

... lista do menu

}

O nome do recurso é meuMenu, o tipo é MENU e a área está delimitada por chaves. As chaves podem ser substitídas por BEGIN e END.

 

Na lista do menu podemos usar as palavras-chave MENUITEM e POPUP. A declaração de POPUP é para itens especiais que mostram uma lista de sub-itens quando são selecionados. A declaração MENUITEM define um item único, sem sub-itens.

A sintaxe de MENUITEM é a seguinte:

MENUITEM "&texto", ID, [lista de opções]

MENUITEM SEPARATOR

  • "&texto": o texto do item (ou seu nome), uma string entre aspas duplas. O sinal & precede a letra da tecla aceleradora.
  • ID: especifica o resultado quando o item é selecionado, ou seja, é o IDentificador do item. O ID é sempre um número inteiro.
  • [lista de opções]: este parâmetro opcional especifica a aparência do item. Podemos usar uma ou mais das seguintes opções separadas por vírgula ou espaço
    • CHECKED - o item possui um (tique) marcador
    • GRAYED - item inativo em cor cinza
    • HELP - identifica um item de ajuda
    • INACTIVE - o item é mostrado mas não pode ser selecionado
    • MENUBARBRAKE - o mesmo que MENUBRAKE
    • MENUBREAK - posiciona o item numa nova linha

A forma MENUITEM SEPARATOR da declaração MENUITEM cria um item de menu inativo que serve como barra divisória entre dois itens de menu M ativos.

 

A sintaxe de POPUP é:

POPUP "&texto", [lista de opções]

BEGIN

... definições dos itens

END

  • [lista de opções]
    • CHECKED - o item possui um (tique) marcador
    • GRAYED - item inativo em cor cinza
    • INACTIVE - o item é mostrado mas não pode ser selecionado
    • MENUBARBRAKE - separa colunas com uma linha vertical
    • MENUBREAK - posiciona o item numa nova coluna

As opções GRAYED e INACTIVE NÃO podem ser usadas em conjunto.

 

3. EXEMPLO DE RECURSO MENU

 

lanchonete MENU

BEGIN

MENUITEM "&Sopa", 100

MENUITEM "S&alada", 101

POPUP "&Entradas"

BEGIN

MENUITEM "&Peixe", 200

MENUITEM "&Frango", 201, CHECKED

POPUP "&Afrodisíacos"

BEGIN

MENUITEM "Sopa de &Piranha", 300

MENUITEM "&Amendoim", 301

END

END

MENUITEM "So&bremesa", 103

END

 

4. MENU PADRÃO DA CLASSE

 

Para que um menu seja o menu padrão de uma classe, é preciso incluí-lo na estrutura WNDCLASSEX. A partir daí, toda janela que for criada a partir da classe definida por esta estrutura estará associada a este menu padrão da classe - o menu default.

 

4a. Adicionando um menu padrão

 

A esta altura do campeonato você já está careca de saber que existe um modelo de criação de janelas na Caixa de Ferramentas. Vamos apenas adicionar e destacar a inclusão do menu "lanchonete".

...

 

.DATA

NomeClasse db "MenuPadrao", 0

TituloJanela db "Menu Malandro", 0

NomeMenu db "lachonete", 0 // O nome do menu no arquivo de recursos

 

.CODE

inicio:

...

gerenteJanela proc mInst:DWORD, mInstAnt:DWORD, linhaCmd:DWORD, Mostra:DWORD

...

mov ej.cbSize, SIZEOF WNDCLASSEX

mov ej.style, CS_HREDRAW or CS_VREDRAW

mov ej.lpfnWndProc, OFFSET gerenteMensagem

mov ej.cbClsExtra, NULL

mov ej.cbWndExtra, NULL

push mInst

pop ej.hInstance

invoke LoadIcon, NULL, IDI_WINLOGO

mov ej.hIcon, eax

mov ej.hIconSm, eax

invoke LoadCursor, NULL, IDC_ARROW

mov ej.hCursor, eax

mov ej.hbrBackground, COLOR_WINDOW+1

mov ej.lpszMenuName, OFFSET NomeMenu

mov ej.lpszClassName, OFFSET NomeClasse

invoke RegisterClassEx, ADDR ej

...

 

5. MENU ESPECÍFICO DO OBJETO

 

Um dos parâmetros da função CreateWindowEx é para indicar o menu associado à janela que está sendo criada, por isso mesmo, um menu particular. Este menu particular tem precedência sobre o menu padrão da classe. Em outras palavras, caso tenham sido definidos um menu padrão na classe e um menu específico ao criar um objeto desta classe, somente o menu específico é mostrado. Portanto, podemos definir um menu para a classe, um menu para o objeto ou os dois. Só para relembrar, aqui vai a função:

HWND CreateWindowEx(

DWORD dwExStyle, // estilo ampliado

LPCTSTR lpClassName, // ponteiro para o nome da classe

LPCTSTR lpWindowName, // ponteiro para o nome da janela

DWORD dwStyle, // estilo da janela

int x, // posição horizontal da janela

int y, // posição vertical da janela

int nWidth, // largura da janela

int nHeight, // altura da janela

HWND hWndParent, // manipulador para a janela-mãe ou proprietária

HMENU hMenu, // manipulador para o menu

HINSTANCE hInstance, // manipulador para a instância do aplicativo

LPVOID lpParam // ponteiro para dados para a criação da janela

);

 

5a. Adicionando um menu específico

...

 

.DATA

NomeClasse db "MenuPadrao",0

TituloJanela db "Menu Malandro",0

NomeMenu db "lachonete", 0 // O nome do menu no arquivo de recursos

 

.DATA?

mMenu HMENU ?

 

.CODE

inicio:

...

gerenteJanela proc mInst:DWORD, mInstAnt:DWORD, linhaCmd:DWORD, Mostra:DWORD

...

invoke LoadMenu, mInst, OFFSET NomeMenu

mov mMenu, eax

invoke CreateWindowEx, NULL, ADDR NomeClasse, ADDR TituloJanela,

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, NULL, mMenu, mInst, NULL

...

 

6. GERENCIANDO AS SELEÇÕES DE ITENS

 

Quando o usuário seleciona um item de menu, o sistema gera uma mensagem WM_COMMAND cujo parâmetro wParam contém o identificador (ID) deste item. O identificador ocupa apenas a palavra (word) menos significativa de wParam (Se você tiver dúvidas, leia mais sobre palavra menos significativa em "Registradores"). Podemos então armazenar o ID do item de menu em AX, compará-lo com os IDs definidos para cada item no arquivo de recursos e definir o procedimento adequado.

 

Fica mais prático definir constantes que correspondam aos IDs de cada item de menu. É claro que seus valores precisam ser os definidos no arquivo de recursos.

...

.CONST

mnID_sopa equ 100

mnID_salada equ 101

mnID_peixe equ 200

mnID_frango equ 201

mnID_piranha equ 300

mnID_amendoim equ 301

mnID_sobremesa equ 103

...

.CODE

inicio:

...

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

...

.IF uMsg == WM_COMMAND

mov eax, wParam

.IF ax == mnID_sopa

...

.ELSEIF ax == mnID_salada

...

...

.ENDIF

.ELSEIF ...

 

7. Janela com menu padrão

Janela com Menu

ATÉLOGO

 

Resumindo:

  • Menus são recursos descritos em arquivos de recursos de acordo com a sintaxe da Resource Script Language.
  • Cada item de menu precisa de um número identificador (ID) para que possa ser acessado
  • Menus podem ser associados a uma classe. São os menus padrão incluídos na estrutura WNDCLASSEX. Neste caso, todos os objetos criados a partir desta classe possuem o mesmo menu.
  • Menus também podem estar associados a um objeto. São os menus referenciados no parâmetro hMenu da função que cria o objeto (a CreateWindowEx). Neste caso, mesmo que exista um menu padrão da classe, o menu mostrado é o do objeto.

Para download:

 

O arquivo tutNB08.zip (15 Kb) contém os código fonte e os exemplos deste tutorial.

 


| AAAA | Página Inicial | Mapa do Site | Novidades | Busca | Indique esta página | Mestre da Teia | Voltar |
| Localizador || @ Info NumaBoa > oicìliS > Assembly > Menus
Créditos: vovó Vicki

webdesign sobMedida by vickiSoft - /informatica/oiciliS/assembler/tutMenu/menu.php (05.02.02) versão 1.0 de 06.02.02
Licença Creative Commons 1998-2006 Aldeia NumaBoa
Exceto onde especificamente declarado, todo material deste site é disponibilizado de acordo com a Licença Creative Commons.