Sobre menus
Um menu é uma lista de itens que especificam opções ou grupos de opções (um submenu) para um aplicativo. Clicar em um item de menu abre um submenu ou faz com que o aplicativo execute um comando. Esta seção fornece informações sobre os seguintes tópicos:
- Barras de Menus e Menus
- Acesso do teclado aos menus
- Criação de menu
-
Itens de Menu
- Itens de comando e itens que abrem submenus
- Identificador de item de menu
- Posição do item de menu
- Acessando itens de menu programaticamente
- Itens de menu padrão
- Itens de menu selecionados e desmarcados
- Itens de menu habilitados, esmaecidos e desabilitados
- Itens de menu realçados
- Itens de menu desenhados pelo proprietário
- Separadores de item de menu e quebras de linha
- Mensagens usadas com menus
- Destruição do menu
Barras de Menus e Menus
Um menu é organizado em uma hierarquia. No nível superior da hierarquia está a barra de menus; que contém uma lista de menus, que, por sua vez, podem conter submenus. Às vezes, uma barra de menus é chamada de menu de nível superior, e os menus e submenus também são conhecidos como menus pop-up.
Um item de menu pode executar um comando ou abrir um submenu. Um item que executa um comando é chamado de item de comando ou comando.
Um item na barra de menus quase sempre abre um menu. Barras de menus raramente contêm itens de comando. Um menu aberto na barra de menus cai da barra de menus e, às vezes, é chamado de menu suspenso. Quando um menu suspenso é exibido, ele é anexado à barra de menus. Um item de menu na barra de menus que abre um menu suspenso também é chamado de nome de menu.
Os nomes de menu em uma barra de menus representam as categorias de main de comandos que um aplicativo fornece. Selecionar um nome de menu na barra de menus normalmente abre um menu cujos itens de menu correspondem aos comandos em uma categoria. Por exemplo, uma barra de menus pode conter um nome de menu Arquivo que, quando clicado pelo usuário, ativa um menu com itens de menu como Novo, Abrir e Salvar. Para obter informações sobre uma barra de menus, chame GetMenuBarInfo.
Somente uma janela pop-up ou sobreposta pode conter uma barra de menus; uma janela filho não pode conter uma. Se a janela tiver uma barra de título, o sistema posicionará a barra de menus logo abaixo dela. Uma barra de menus está sempre visível. No entanto, um submenu não fica visível até que o usuário selecione um item de menu que o ative. Para obter mais informações sobre janelas pop-up e sobrepostas, consulte Tipos de janela.
Cada menu deve ter uma janela de proprietário. O sistema envia mensagens para a janela de proprietário de um menu quando o usuário seleciona o menu ou escolhe um item no menu.
Esta seção discute os tópicos a seguir.
Menus de atalho
O sistema também fornece menus de atalho. Um menu de atalho não está anexado à barra de menus; ele pode aparecer em qualquer lugar na tela. Um aplicativo normalmente associa um menu de atalho a uma parte de uma janela, como a área do cliente ou a um objeto específico, como um ícone. Por esse motivo, esses menus também são chamados de menus de contexto.
Um menu de atalho permanece oculto até que o usuário o ative, normalmente clicando com o botão direito do mouse em uma seleção, uma barra de ferramentas ou um botão da barra de tarefas. O menu geralmente é exibido na posição do cursor do mouse.
Menu Janela
O menu Janela (também conhecido como menu Sistema ou menu Controle ) é um menu pop-up definido e gerenciado quase exclusivamente pelo sistema operacional. O usuário pode abrir o menu da janela clicando no ícone do aplicativo na barra de título ou clicando com o botão direito do mouse em qualquer lugar na barra de título.
O menu Janela fornece um conjunto padrão de itens de menu que o usuário pode optar por alterar o tamanho ou a posição de uma janela ou fechar o aplicativo. Os itens no menu da janela podem ser adicionados, excluídos e modificados, mas a maioria dos aplicativos usa apenas o conjunto padrão de itens de menu. Uma janela filho, pop-up ou sobreposta pode ter um menu de janela. É incomum que uma janela pop-up ou sobreposta não inclua um menu de janela.
Quando o usuário escolhe um comando no menu Janela , o sistema envia uma mensagem WM_SYSCOMMAND para a janela de proprietário do menu. Na maioria dos aplicativos, o procedimento de janela não processa mensagens do menu da janela. Em vez disso, ele simplesmente passa as mensagens para a função DefWindowProc para processamento padrão do sistema da mensagem. Se um aplicativo adicionar um comando ao menu de janela, o procedimento de janela deverá processar o comando.
Um aplicativo pode usar a função GetSystemMenu para criar uma cópia do menu de janela padrão para modificar. Qualquer janela que não usa a função GetSystemMenu para fazer sua própria cópia do menu de janela recebe o menu de janela padrão.
Identificador de Ajuda
Associado a cada barra de menus, menu, submenu e menu de atalho é um identificador de ajuda. Se o usuário pressionar a tecla F1 enquanto o menu estiver ativo, esse valor será enviado para a janela do proprietário como parte de uma mensagem WM_HELP .
Acesso de teclado aos menus
O sistema fornece uma interface de teclado padrão para menus. Você pode aprimorar essa interface fornecendo chaves de acesso mnemônicas e teclas de atalho (acelerador) para seus itens de menu.
Os tópicos a seguir descrevem a interface de teclado padrão, as teclas de acesso e as teclas de atalho:
Interface de teclado padrão
O sistema foi projetado para funcionar com ou sem um mouse ou outro dispositivo apontador. Como o sistema fornece uma interface de teclado padrão, o usuário pode usar o teclado para selecionar itens de menu. Essa interface de teclado não precisa de código especial. Um aplicativo recebe uma mensagem de comando se o usuário seleciona um item de menu por meio do teclado ou usando um mouse. A interface de teclado padrão processa os seguintes pressionamentos de tecla.
Teclas | Ação |
---|---|
Caractere alfabético | Seleciona o primeiro item de menu com o caractere especificado como sua chave de acesso. Se o item selecionado invocar um menu, o menu será exibido e o primeiro item será realçado. Caso contrário, o item de menu será escolhido. |
ALT | Alterna para dentro e para fora do modo de barra de menus. |
ALT+BARRA DE ESPAÇOS | Exibe o menu da janela. |
Enter | Ativa um menu e seleciona o primeiro item de menu se um item tiver um menu associado a ele. Caso contrário, esse pressionamento de tecla escolhe o item como se o usuário liberasse o botão do mouse enquanto o item estava selecionado. |
ESC | Sai do modo de menu. |
SETA PARA A ESQUERDA | Percorre o item de menu de nível superior anterior. Os itens de menu de nível superior incluem nomes de menu e o menu da janela. Se o item selecionado estiver em um menu, a coluna anterior no menu será selecionada ou o item de menu de nível superior anterior será selecionado. |
SETA PARA A DIREITA | Funciona como a tecla SETA PARA A ESQUERDA, exceto na direção oposta. Nos menus, esse pressionamento de tecla avança uma coluna; quando o item selecionado no momento estiver na coluna de extrema direita, o próximo menu será selecionado. |
SETAS PARA CIMA OU PARA BAIXO | Ativa um menu quando pressionado em um nome de menu. Quando pressionado em um menu, o pressionamento de teclas SETA PARA CIMA seleciona o item anterior; o pressionamento de teclas SETA PARA BAIXO seleciona o próximo item. |
Chaves de Acesso do Menu
A interface de teclado padrão para menus pode ser aprimorada adicionando teclas de acesso (mnemonics) aos itens de menu. Uma chave de acesso é uma letra sublinhada no texto de um item de menu. Quando um menu está ativo, o usuário pode selecionar um item de menu pressionando a tecla que corresponde à letra sublinhada do item. O usuário torna a barra de menus ativa pressionando a tecla ALT para realçar o primeiro item na barra de menus. Um menu está ativo quando é exibido.
Para criar uma chave de acesso para um item de menu, preceda qualquer caractere na cadeia de texto do item com um e comercial. Por exemplo, a cadeia de texto "&Mover" faz o sistema sublinhar a letra "M".
Teclas de Atalho de Menu
Além de ter uma chave de acesso, um item de menu pode ter uma chave de atalho associada a ela. Uma tecla de atalho é diferente de uma chave de acesso, pois o menu não precisa estar ativo para que a tecla de atalho funcione. Além disso, uma chave de acesso é sempre associada a um item de menu, enquanto uma tecla de atalho geralmente é (mas não precisa ser) associada a um item de menu.
O texto que identifica a tecla de atalho é adicionado à cadeia de caracteres de texto do item de menu. O texto de atalho aparece à direita do nome do item de menu, após uma barra invertida e um caractere de tabulação (\t). Por exemplo, "&Close\tAlt+F4" representa um comando Close com a combinação de teclas ALT+F4 como sua tecla de atalho e com a letra "C" como sua chave de acesso. Para obter mais informações, consulte Aceleradores de teclado.
Criação de menu
Você pode criar um menu usando um modelo de menu ou funções de criação de menu. Os modelos de menu normalmente são definidos como recursos. Os recursos de modelo de menu podem ser carregados explicitamente ou atribuídos como o menu padrão para uma classe de janela. Você também pode criar recursos de modelo de menu dinamicamente na memória.
Os tópicos a seguir descrevem a criação do menu em detalhes:
- Recursos do modelo de menu
- Modelo de menu na memória
- Identificadores de menu
- Funções de criação de menu
- Exibição do menu
- Menus de classe de janela
Recursos do modelo de menu
A maioria dos aplicativos cria menus usando recursos de modelo de menu. Um modelo de menu define um menu, incluindo os itens na barra de menus e todos os menus. Para obter informações sobre como criar um recurso de modelo de menu, consulte a documentação incluída nas ferramentas de desenvolvimento.
Depois de criar um recurso de modelo de menu e adicioná-lo ao arquivo executável (.exe) do aplicativo, você pode usar a função LoadMenu para carregar o recurso na memória. Essa função retorna um identificador para o menu, que você pode atribuir a uma janela usando a função SetMenu . Você pode atribuir um menu a qualquer janela que não seja uma janela filho.
Implementar menus como recursos facilita a localização de um aplicativo para uso em vários países/regiões. Somente o arquivo de definição de recurso precisa ser localizado para cada idioma, não para o código-fonte do aplicativo.
Modelo de menu na memória
Um menu pode ser criado a partir de um modelo de menu que é integrado à memória em tempo de execução. Por exemplo, um aplicativo que permite que um usuário personalize seu menu pode criar um modelo de menu na memória com base nas preferências do usuário. Em seguida, o aplicativo pode salvar o modelo em um arquivo ou no registro para uso futuro. Para criar um menu de um modelo na memória, use a função LoadMenuIndirect . Para obter descrições de formatos de modelo de menu, consulte Recursos de modelo de menu.
Um modelo de menu padrão consiste em uma estrutura MENUITEMTEMPLATEHEADER seguida por uma ou mais estruturas MENUITEMTEMPLATE .
Um modelo de menu estendido consiste em uma estrutura de MENUEX_TEMPLATE_HEADER seguida por uma ou mais estruturas de MENUEX_TEMPLATE_ITEM .
Identificadores de menu
O sistema gera um identificador exclusivo para cada menu. Um identificador de menu é um valor do tipo HMENU . Um aplicativo deve especificar um identificador de menu em muitas das funções de menu. Você recebe um identificador para uma barra de menus ao criar o menu ou carregar um recurso de menu.
Para recuperar um identificador na barra de menus de um menu que foi criado ou carregado, use a função GetMenu . Para recuperar um identificador para o submenu associado a um item de menu, use a função GetSubMenu ou GetMenuItemInfo . Para recuperar um identificador em um menu de janela, use a função GetSystemMenu .
Funções de criação de menu
Usando funções de criação de menu, você pode criar menus em tempo de execução ou adicionar itens de menu aos menus existentes. Você pode usar a função CreateMenu para criar uma barra de menus vazia e a função CreatePopupMenu para criar um menu vazio. Você pode salvar determinadas informações de configurações para um menu usando a estrutura MENUINFO . Para obter ou recuperar as configurações de um menu, use GetMenuInfo ou SetMenuInfo. Para adicionar itens a um menu, use a função InsertMenuItem . As funções AppendMenu e InsertMenu mais antigas ainda têm suporte, mas InsertMenuItem deve ser usado para novos aplicativos.
Exibição do menu
Depois que um menu tiver sido carregado ou criado, ele deverá ser atribuído a uma janela antes que o sistema possa exibi-lo. Você pode atribuir um menu definindo um menu de classe. Para obter mais informações, consulte Menus de classe de janela. Você também pode atribuir um menu a uma janela especificando um identificador para o menu como o parâmetro hMenu da função CreateWindow ou CreateWindowEx ou chamando a função SetMenu .
Para exibir um menu de atalho, use a função TrackPopupMenuEx . Os menus de atalho, também chamados de menus pop-up flutuantes ou menus de contexto, normalmente são exibidos quando a mensagem WM_CONTEXTMENU é processada.
Você pode atribuir um menu a qualquer janela que não seja uma janela filho.
A função TrackPopupMenu mais antiga ainda tem suporte, mas novos aplicativos devem usar a função TrackPopupMenuEx .
Menus de classe de janela
Você pode especificar um menu padrão, chamado de menu de classe, ao registrar uma classe de janela. Para fazer isso, atribua o nome do recurso menu-modelo ao membro lpszMenuName da estrutura WNDCLASS usada para registrar a classe.
Por padrão, cada janela recebe o menu de classe de sua classe de janela para que você não precise carregar explicitamente o menu e atribuí-lo a cada janela. Você pode substituir o menu de classe especificando um identificador de menu diferente em uma chamada para a função CreateWindowEx . Você também pode alterar o menu de uma janela depois que ela for criada usando a função SetMenu . Para obter mais informações, consulte Classes de janela.
Itens de menu
Os tópicos a seguir discutem o que o sistema faz quando o usuário escolhe um item de menu e as maneiras como um aplicativo pode controlar a aparência e a funcionalidade de um item:
- Itens de comando e itens que abrem submenus
- Identificador de item de menu
- Posição do item de menu
- Acessando itens de menu programaticamente
- Itens de menu padrão
- Itens de menu selecionados e desmarcados
- Itens de menu habilitados, esmaecidos e desabilitados
- Itens de menu realçados
- Itens de menu desenhados pelo proprietário
- Separadores de item de menu e quebras de linha
Itens de comando e itens que abrem submenus
Quando o usuário escolhe um item de comando, o sistema envia uma mensagem de comando para a janela que possui o menu. Se o item de comando estiver no menu da janela, o sistema enviará a mensagem WM_SYSCOMMAND . Caso contrário, ele enviará a mensagem WM_COMMAND .
Associado a cada item de menu que abre um submenu é um identificador para o submenu correspondente. Quando o usuário aponta para esse item, o sistema abre o submenu. Nenhuma mensagem de comando é enviada para a janela do proprietário. No entanto, o sistema envia uma mensagem WM_INITMENUPOPUP para a janela do proprietário antes de exibir o submenu. Você pode obter um identificador para o submenu associado a um item usando a função GetSubMenu ou GetMenuItemInfo .
Uma barra de menus normalmente contém nomes de menu, mas também pode conter itens de comando. Um submenu normalmente contém itens de comando, mas também pode conter itens que abrem submenus aninhados. Ao adicionar esses itens a submenus, você pode aninhar menus a qualquer profundidade. Para fornecer uma indicação visual para o usuário, o sistema exibe automaticamente uma pequena seta à direita do texto de um item de menu que abre um submenu.
Identificador de Menu-Item
Associado a cada item de menu é um inteiro exclusivo definido pelo aplicativo, chamado de identificador de item de menu. Quando o usuário escolhe um item de comando em um menu, o sistema envia o identificador do item para a janela do proprietário como parte de uma mensagem WM_COMMAND . O procedimento de janela examina o identificador para determinar a origem da mensagem e processa a mensagem adequadamente. Além disso, você pode especificar um item de menu usando seu identificador ao chamar funções de menu; por exemplo, para habilitar ou desabilitar um item de menu.
Os itens de menu que abrem submenus têm identificadores, assim como os itens de comando. No entanto, o sistema não envia uma mensagem de comando quando esse item é selecionado em um menu. Em vez disso, o sistema abre o submenu associado ao item de menu.
Para recuperar o identificador do item de menu em uma posição especificada, use a função GetMenuItemID ou GetMenuItemInfo .
Posição Menu-Item
Além de ter um identificador exclusivo, cada item de menu em uma barra de menus ou menu tem um valor de posição exclusivo. O item mais à esquerda em uma barra de menus, ou o item superior em um menu, tem a posição zero. O valor da posição é incrementado para itens de menu subsequentes. O sistema atribui um valor de posição a todos os itens em um menu, incluindo separadores. A ilustração a seguir mostra os valores de posição dos itens em uma barra de menus e em um menu.
Ao chamar uma função de menu que modifica ou recupera informações sobre um item de menu específico, você pode especificar o item usando seu identificador ou sua posição. Para obter mais informações, consulte a próxima seção.
Acessando itens de menu programaticamente
A maioria das funções de menu permite que você especifique um item de menu por posição ou por comando. Algumas funções usam os sinalizadores MF_BYPOSITION e MF_BYCOMMAND para indicar o algoritmo de pesquisa; outros têm um parâmetro fByPosition explícito. Se você especificar o item de menu por posição, o número do item será um índice baseado em zero no menu. Se você especificar o item de menu por comando, o menu e seus submenus serão pesquisados em busca de um item cujo identificador de menu seja igual ao número de item fornecido. Se mais de um item na hierarquia de menus corresponder ao número do item, não será especificado qual deles será usado. Se os menus contiverem identificadores de menu duplicados, você deverá usar operações de menu baseadas em posição para evitar essa ambiguidade.
Itens de menu padrão
Um submenu pode conter um item de menu padrão. Quando o usuário abre um submenu clicando duas vezes, o sistema envia uma mensagem de comando para a janela de proprietário do menu e fecha o menu como se o item de comando padrão tivesse sido escolhido. Se não houver nenhum item de comando padrão, o submenu permanecerá aberto. Para recuperar e definir o item padrão para um submenu, use as funções GetMenuDefaultItem e SetMenuDefaultItem .
Itens de menu selecionados e desmarcados
Um item de menu pode ser selecionado ou desmarcado. O sistema exibe um bitmap ao lado dos itens de menu selecionados para indicar o estado selecionado. O sistema não exibe um bitmap ao lado de itens limpos, a menos que um bitmap "claro" definido pelo aplicativo seja especificado. Somente itens de menu em um menu podem ser selecionados; itens em uma barra de menus não podem ser selecionados.
Normalmente, os aplicativos marcar ou limpam um item de menu para indicar se uma opção está em vigor. Por exemplo, suponha que um aplicativo tenha uma barra de ferramentas que o usuário pode mostrar ou ocultar usando um comando toolbar em um menu. Quando a barra de ferramentas está oculta, o item de menu barra de ferramentas fica claro. Quando o usuário escolhe o comando, o aplicativo verifica o item de menu e mostra a barra de ferramentas.
Um atributo de marca marcar controla se um item de menu está selecionado. Você pode definir o atributo de marca de marcar de um item de menu usando a função CheckMenuItem. Você pode usar a função GetMenuState para determinar se um item de menu está selecionado ou desmarcado no momento.
Em vez de CheckMenuItem e GetMenuState, você pode usar as funções GetMenuItemInfo e SetMenuItemInfo para recuperar e definir o estado marcar de um item de menu.
Às vezes, um grupo de itens de menu corresponde a um conjunto de opções mutuamente exclusivas. Nesse caso, você pode indicar a opção selecionada usando um item de menu de opção selecionado (análogo a um controle de botão de opção). Os itens de rádio selecionados são exibidos com um bitmap de marcador em vez de um bitmap de marca marcar. Para marcar um item de menu e torná-lo um item de rádio, use a função CheckMenuRadioItem.
Por padrão, o sistema exibe uma marca marcar ou bitmap de marcador ao lado de itens de menu selecionados e nenhum bitmap ao lado de itens de menu desmarcados. No entanto, você pode usar a função SetMenuItemBitmaps para associar bitmaps selecionados e limpos definidos pelo aplicativo a um item de menu. Em seguida, o sistema usa os bitmaps especificados para indicar o estado selecionado ou limpo do item de menu.
Bitmaps definidos pelo aplicativo associados a um item de menu devem ter o mesmo tamanho que o bitmap de marca padrão marcar, as dimensões das quais podem variar dependendo da resolução da tela. Para recuperar as dimensões corretas, use a função GetSystemMetrics . Você pode criar vários recursos de bitmap para resoluções de tela diferentes; crie um recurso de bitmap e dimensione-o, se necessário; ou crie um bitmap em tempo de execução e desenhe uma imagem nele. Os bitmaps podem ser monocromáticos ou de cor. No entanto, como os itens de menu são invertidos quando realçados, a aparência de determinados bitmaps de cor invertida pode ser indesejável. Para obter mais informações, consulte Bitmaps.
Itens de menu habilitados, esmaecidos e desabilitados
Um item de menu pode ser habilitado, esmaecido ou desabilitado. Por padrão, um item de menu está habilitado. Quando o usuário escolhe um item de menu habilitado, o sistema envia uma mensagem de comando para a janela do proprietário ou exibe o submenu correspondente, dependendo do tipo de item de menu.
Quando os itens de menu não estão disponíveis para o usuário, eles devem estar esmaecidos ou desabilitados. Itens de menu esmaecidos e desabilitados não podem ser escolhidos. Um item desabilitado se parece com um item habilitado. Quando o usuário clica em um item desabilitado, o item não é selecionado e nada acontece. Itens desabilitados podem ser úteis em, por exemplo, um tutorial que apresenta um menu que parece ativo, mas não está.
Um aplicativo cinza um item de menu indisponível para fornecer uma indicação visual para o usuário de que um comando não está disponível. Você pode usar um item esmaecido quando uma ação não for apropriada (por exemplo, você pode esmaeçar o comando Imprimir no menu Arquivo quando o sistema não tiver uma impressora instalada).
A função EnableMenuItem habilita, cinza ou desabilita um item de menu. Para determinar se um item de menu está habilitado, esmaecido ou desabilitado, use a função GetMenuItemInfo .
Em vez de GetMenuItemInfo, você também pode usar a função GetMenuState para determinar se um item de menu está habilitado, esmaecido ou desabilitado.
Itens de menu realçados
O sistema realça automaticamente os itens de menu nos menus à medida que o usuário os seleciona. No entanto, o realce pode ser adicionado ou removido explicitamente de um nome de menu na barra de menus usando a função HiliteMenuItem . Essa função não tem efeito sobre os itens de menu nos menus. No entanto, quando HiliteMenuItem é usado para realçar um nome de menu, o nome só parece estar selecionado. Se o usuário pressionar a tecla ENTER, o item realçado não será escolhido. Esse recurso pode ser útil em, por exemplo, um aplicativo de treinamento que demonstra o uso de menus.
Itens do menu Owner-Drawn
Um aplicativo pode controlar completamente a aparência de um item de menu usando um item desenhado pelo proprietário. Os itens desenhados pelo proprietário exigem que um aplicativo assuma total responsabilidade pelo desenho selecionado (realçado), selecionado e estados limpos. Por exemplo, se um aplicativo fornecesse um menu de fonte, ele poderia desenhar cada item de menu usando a fonte correspondente; o item para Romano seria desenhado com romano, o item para Itálico seria desenhado em itálico, e assim por diante. Para obter mais informações, consulte Criando itens de menu Owner-Drawn.
Separadores de item de menu e quebras de linha
O sistema fornece um tipo especial de item de menu, chamado separador, que aparece como uma linha horizontal. Você pode usar um separador para dividir um menu em grupos de itens relacionados. Um separador não pode ser usado em uma barra de menus e o usuário não pode selecionar um separador.
Quando uma barra de menus contém mais nomes de menu do que caberá em uma linha, o sistema encapsula a barra de menus dividindo-a automaticamente em duas ou mais linhas. Você pode fazer com que uma quebra de linha ocorra em um item específico em uma barra de menus atribuindo o sinalizador de tipo MFT_MENUBREAK ao item. O sistema coloca esse item e todos os itens subsequentes em uma nova linha.
Quando um menu contiver mais itens do que caberá em uma coluna, o menu será truncado. Você pode fazer com que uma quebra de coluna ocorra em um item específico em um menu atribuindo o sinalizador de tipo MFT_MENUBREAK ao item ou usando a opção MENUBREAK na instrução MENUITEM . O sistema coloca esse item e todos os itens subsequentes em uma nova coluna. O sinalizador de tipo MFT_MENUBARBREAK tem o mesmo efeito, exceto que uma linha vertical aparece entre a nova coluna e a antiga.
Se você usar as funções AppendMenu, InsertMenu ou ModifyMenu para atribuir quebras de linha, atribua os sinalizadores de tipo MF_MENUBREAK ou MF_MENUBARBREAK.
Mensagens usadas com menus
O sistema relata a atividade relacionada ao menu enviando mensagens para o procedimento de janela da janela que possui o menu. O sistema envia uma série de mensagens quando o usuário seleciona itens na barra de menus ou clica no botão direito do mouse para exibir um menu de atalho.
Quando o usuário ativa um item na barra de menus, a janela do proprietário recebe primeiro uma mensagem WM_SYSCOMMAND . Essa mensagem inclui um sinalizador que indica se o usuário ativou o menu usando o teclado (SC_KEYMENU) ou o mouse (SC_MOUSEMENU). Para obter mais informações, consulte Acesso de teclado aos menus.
Em seguida, antes de exibir qualquer menu, o sistema envia a mensagem WM_INITMENU para o procedimento de janela para que um aplicativo possa modificar os menus antes que o usuário os veja. O sistema envia a mensagem de WM_INITMENU apenas uma vez por ativação de menu.
Quando o usuário aponta para um item de menu que abre um submenu, o sistema envia à janela do proprietário a mensagem WM_INITMENUPOPUP antes de exibir o submenu. Essa mensagem dá ao aplicativo a oportunidade de modificar o submenu antes de ser exibido.
Cada vez que o usuário move o realce de um item para outro, o sistema envia uma mensagem WM_MENUSELECT para o procedimento de janela da janela do proprietário do menu. Esta mensagem identifica o item de menu selecionado no momento. Muitos aplicativos fornecem uma área de informações na parte inferior de suas janelas de main e usam essa mensagem para exibir informações adicionais sobre o item de menu selecionado.
Quando o usuário escolhe um item de comando em um menu, o sistema envia uma mensagem WM_COMMAND para o procedimento de janela. A palavra de baixa ordem do parâmetro wParam da mensagem WM_COMMAND contém o identificador do item escolhido. O procedimento de janela deve examinar o identificador e processar a mensagem adequadamente.
Você pode salvar informações para um menu usando a estrutura MENUINFO . Se o menu for definido com um MENUINFO. Valor dwStyle de MNS_NOTIFYBYPOS, o sistema envia WM_MENUCOMMAND em vez do WM_COMMAND quando um item é selecionado. Isso permite que você acesse as informações na estrutura MENUINFO e também fornece o índice do item selecionado diretamente.
Nem todos os menus são acessíveis por meio da barra de menus de uma janela. Muitos aplicativos exibem menus de atalho quando o usuário clica no botão direito do mouse em um local específico. Esses aplicativos devem processar a mensagem WM_CONTEXTMENU e exibir um menu de atalho, se apropriado. Se um aplicativo não exibir um menu de atalho, ele deverá passar a mensagem WM_CONTEXTMENU para a função DefWindowProc para processamento padrão.
A mensagem WM_MENURBUTTONUP é enviada quando o usuário libera o botão direito do mouse enquanto o cursor está em um item de menu. Essa mensagem é fornecida para que os aplicativos possam exibir um menu contextual ou de atalho para um item de menu.
Há algumas mensagens que envolvem apenas menus de arrastar e soltar. O WM_MENUGETOBJECT é enviado ao proprietário de um menu de arrastar e soltar quando o cursor do mouse entra em um item de menu ou se move do centro de um item para a parte superior ou inferior de um item. A mensagem WM_MENUDRAG é enviada quando o usuário realmente arrasta um item de menu.
Quando um menu suspenso ou um submenu é destruído, o sistema envia uma mensagem de WM_UNINITMENUPOPUP .
Destruição do menu
Se um menu for atribuído a uma janela e essa janela for destruída, o sistema destruirá automaticamente o menu e seus submenus, liberando o identificador do menu e a memória ocupada pelo menu. O sistema não destrói automaticamente um menu que não está atribuído a uma janela. Um aplicativo deve destruir o menu não atribuído chamando a função DestroyMenu . Caso contrário, o menu continuará a existir na memória mesmo após o fechamento do aplicativo. Para encerrar o menu ativo do thread de chamada, use EndMenu. Se uma plataforma não der suporte a EndMenu, envie ao proprietário do menu ativo uma mensagem WM_CANCELMODE .