Informática Numaboa - Tutoriais e Programação
Criando menus em Assembly (masm)
Qui 16 Abr 2009 19:51 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 18:47
- Autor: vovó Vicki
- Acessos: 9967
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".
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:
Adicionando um menu específico
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.
Janela com menu padrão
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.