Compartilhar via


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:

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. As barras de menu 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 é fixado à barra de menus. Um item na barra de menus que abre um menu drop-down também é chamado de nome de menu.

Os nomes de menu em uma barra de menus representam as principais categorias de comandos que um aplicativo fornece. A seleção de 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 sobreposta ou pop-up pode conter uma barra de menus; uma janela filha 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 sobrepostas e pop-up, consulte Tipos de Janela.

Cada menu deve ter uma janela proprietária. 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 com 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 de texto ou do ponteiro do mouse.

O 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 sobreposta, pop-up ou filha pode ter um menu de janela. É incomum que uma janela sobreposta ou pop-up 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 do 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 da 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 use 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

Um identificador de ajuda está associado a cada barra de menus, menu, submenu e menu de atalho. 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 apontando. 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 teclas.

pressionamento de tecla 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 é escolhido.
ALT Alterna dentro e fora do modo de barra de menus.
ALT+BARRA DE ESPAÇOS Exibe o menu da janela.
ENTRAR 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 escolherá 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 Alterna para 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 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 atualmente selecionado estiver na coluna de extrema direita, o próximo menu será selecionado.
SETAS PARA CIMA ou PARA BAIXO Ativa um menu quando se clica em um nome de menu. Quando pressionadas em um menu, a tecla Seta Para Cima seleciona o item anterior; a tecla Seta Para Baixo seleciona o próximo item.

 

A interface de teclado padrão para menus pode ser aprimorada adicionando teclas de acesso (mnemônicos) 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 chave que corresponde à letra sublinhada do item. O usuário ativa a barra de menus 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 caracteres de texto do item com um escarand. Por exemplo, a cadeia de caracteres "&Move" faz com que o sistema sublinhe a letra "M".

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 chave de atalho funcione. Além disso, uma chave de acesso é sempre associada a um item de menu, enquanto uma chave de atalho geralmente é (mas não precisa ser) associada a um item de menu.

O texto que identifica a chave de atalho é adicionado à cadeia 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 guia (\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.

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:

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

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.

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

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 para um menu de janela, use a função GetSystemMenu.

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.

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 da Classe da 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 filha.

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, confira Classes de janela.

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

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 .

Cada item de menu que abre um submenu tem associado 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 de 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 aos 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.

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 .

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.

menu e barra de menus

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 secção seguinte.

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 seu submenu serão pesquisados por um item cujo identificador de menu é 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 limpos

Um item de menu pode ser selecionado ou desmarcado. O sistema exibe um bitmap ao lado de 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 "clear" especificado pelo aplicativo seja definido. Somente itens de menu em um menu podem ser selecionados; itens em uma barra de menus não podem ser selecionados.

Normalmente, os aplicativos verificam 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 possa mostrar ou ocultar usando um comando da Barra de Ferramentas em um menu. Quando a barra de ferramentas estiver oculta, o item de menu barra de ferramentas ficará limpo. Quando o usuário escolhe o comando, o aplicativo verifica o item de menu e mostra a barra de ferramentas.

O atributo de marca de seleção controla se um item de menu está selecionado. Você pode definir o atributo de verificação de um item de menu ao usar 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 de verificação 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 rádio selecionado (análogo a um botão de rádio). Os itens de rádio selecionados são exibidos com um bitmap de ponto em vez de um bitmap de marca de seleção. Para verificar 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 de seleção 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 desmarcados definidos pelo aplicativo a um item de menu. Em seguida, o sistema usa os bitmaps especificados para indicar o estado selecionado ou desmarcado do item de menu.

Os bitmaps definidos pelo aplicativo associados a um item de menu devem ter o mesmo tamanho que o bitmap de marca de seleção padrão, das quais as dimensões 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; criar um recurso de bitmap e dimensioná-lo, se necessário; ou crie um bitmap em tempo de execução e desenhe uma imagem nela. Os bitmaps podem ser monocromáticos ou de cor. No entanto, como os itens do menu são invertidos quando destacados, a aparência de alguns bitmaps com cores invertidas 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, acinzentado 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 que ele é.

Quando os itens de menu não estão disponíveis para o usuário, eles devem estar em cinza ou desabilitados. Itens de menu acinzentados e desabilitados não podem ser escolhidos. Um item desativado se parece com um item ativado. 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 é apropriada (por exemplo, você pode esmaear 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, acinzentado 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, acinzentado ou desabilitado.

Itens de menu realçados

O sistema realça automaticamente os itens de menu nos menus conforme 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 nos 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 de 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 desmarcado. Por exemplo, se um aplicativo fornecesse um menu de fonte, ele poderia exibir cada item de menu usando a fonte correspondente; o item para romano seria exibido em romano, o item para itálico seria exibido em itálico, e assim por diante. Para obter mais informações, consulte Criando itens de menu Owner-Drawn.

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, deverá atribuir os sinalizadores de tipo MF_MENUBREAK ou MF_MENUBARBREAK.

Mensagens usadas com menus

O sistema informa a atividade relacionada ao menu enviando mensagens ao procedimento 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 um WM_SYSCOMMAND mensagem. 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 os menus, 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 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.

Sempre que o usuário move o destaque de um item para outro, o sistema envia uma mensagem WM_MENUSELECT para o procedimento de 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 principais 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 da 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 valor dwStyle de MENUINFO MNS_NOTIFYBYPOS, o sistema envia WM_MENUCOMMAND em vez de 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 de atalho ou sensível ao contexto 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 WM_UNINITMENUPOPUP.

Se um menu for atribuído a uma janela e essa janela for destruída, o sistema destruirá automaticamente o menu e seu submenu, liberando o identificador do menu e a memória ocupada pelo menu. O sistema não destrói automaticamente um menu que não é 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 ao EndMenu, envie ao proprietário do menu ativo uma mensagem de WM_CANCELMODE .