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

Criando menus em Assembly (masm)

Qui

16

Abr

2009


19:51

(3 votos, média 5.00 de 5) 


Nível intermediário

Um pouco mais de recursos. Como escrever um recurso de menu, como incorporá-lo à sua janela e como gerenciar seus itens. Fácil, fácil. Neste tutorial vamos explorar um pouco mais os recursos, focalizando especificamente os menus.

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.

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
}

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

Na lista do menu podemos usar as palavras-chave MENUITEM e POPUP. A declaração 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 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.

Exemplo de um recurso de 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

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 baseada na classe definida por esta estrutura estará associada a este menu padrão da classe - o menu default.

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. Vou apenas 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 ...

Menu específico de um objeto

Um dos parâmetros da função CreateWindowEx é para indicar o menu associado à janela que está sendo criada, por isto 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 );

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

Gerenciando as seleções de itens do menu

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 a ID do item de menu em AX, compará-la com as IDs definidas para cada item no arquivo de recursos e definir o procedimento adequado.

Fica mais prático definir constantes que correspondam às 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 ...

Janela com menu padrão

Menu

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 o código fonte e os exemplos deste tutorial. Está em Downloads / Tutoriais / Assembly Numaboa.

Логофет Вадимкисти macЛобановскийсоединить ноутбукфотострана киевtranslation english to franceхарьков никас

Informações adicionais