Classe CMenu
Um encapsulamento do Windows HMENU
.
Sintaxe
class CMenu : public CObject
Membros
Construtores públicos
Nome | Descrição |
---|---|
CMenu::CMenu |
Constrói um objeto CMenu . |
Métodos públicos
Nome | Descrição |
---|---|
CMenu::AppendMenu |
Acrescenta um novo item ao final deste menu. |
CMenu::Attach |
Anexa um identificador de menu do Windows a um objeto CMenu . |
CMenu::CheckMenuItem |
Coloca uma marca de seleção próxima ou remove uma marca de seleção de um item de menu no menu de item pop-up. |
CMenu::CheckMenuRadioItem |
Coloca um botão de opção próximo a um item de menu e remove o botão de opção de todos os outros itens de menu no grupo. |
CMenu::CreateMenu |
Cria um menu vazio e o anexa a um objeto CMenu . |
CMenu::CreatePopupMenu |
Cria um menu de item pop-up vazio e o anexa a um objeto CMenu . |
CMenu::DeleteMenu |
Exclui um item especificado do menu. Se o item de menu tiver um menu de item pop-up associado, destruirá o identificador para o menu de item pop-up e liberará a memória usada por ele. |
CMenu::DeleteTempMap |
Exclui todos os objetos temporários CMenu criados pela função membro FromHandle . |
CMenu::DestroyMenu |
Destrói o menu anexado a um objeto CMenu e libera toda memória ocupada pelo menu. |
CMenu::Detach |
Desanexa um identificador de menu do Windows de um objeto CMenu e retorna o identificador. |
CMenu::DrawItem |
Chamado pela estrutura quando um aspecto visual de um menu desenhado pelo proprietário é alterado. |
CMenu::EnableMenuItem |
Habilita, desabilita ou esmaece (acinzenta) um item de menu. |
CMenu::FromHandle |
Retorna um ponteiro para um objeto CMenu , dado um identificador de menu do Windows. |
CMenu::GetDefaultItem |
Determina o item de menu padrão no menu especificado. |
CMenu::GetMenuContextHelpId |
Recupera a ID de contexto de ajuda associada ao menu. |
CMenu::GetMenuInfo |
Recupera informações em um menu específico. |
CMenu::GetMenuItemCount |
Determina o número de itens em um menu de item pop-up ou de nível superior. |
CMenu::GetMenuItemID |
Obtém o identificador de item de menu para um item de menu localizado na posição especificada. |
CMenu::GetMenuItemInfo |
Recupera informações sobre um item de menu. |
CMenu::GetMenuState |
Retorna o status do item de menu especificado ou o número de itens em um menu de item pop-up. |
CMenu::GetMenuString |
Recupera o rótulo do item de menu especificado. |
CMenu::GetSafeHmenu |
Retorna o m_hMenu encapsulado por este objeto CMenu . |
CMenu::GetSubMenu |
Recupera um ponteiro para um menu de item pop-up. |
CMenu::InsertMenu |
Insere um novo item de menu na posição especificada, movendo outros itens para baixo no menu. |
CMenu::InsertMenuItem |
Insere um novo item de menu na posição especificada em um menu. |
CMenu::LoadMenu |
Carrega um recurso de menu do arquivo executável e o anexa a um objeto CMenu . |
CMenu::LoadMenuIndirect |
Carrega um menu de um modelo de menu na memória e o anexa a um objeto CMenu . |
CMenu::MeasureItem |
Chamado pela estrutura para determinar dimensões de menu quando um menu desenhado pelo proprietário é criado. |
CMenu::ModifyMenu |
Altera um item de menu existente na posição especificada. |
CMenu::RemoveMenu |
Exclui um item de menu com um menu de item pop-up associado do menu especificado. |
CMenu::SetDefaultItem |
Define o item de menu padrão para o menu especificado. |
CMenu::SetMenuContextHelpId |
Define a ID de contexto de ajuda que será associada ao menu. |
CMenu::SetMenuInfo |
Define informações em um menu específico. |
CMenu::SetMenuItemBitmaps |
Associa os bitmaps de marca de seleção especificados a um item de menu. |
CMenu::SetMenuItemInfo |
Altera informações sobre um item de menu. |
CMenu::TrackPopupMenu |
Exibe um menu pop-up flutuante no local especificado e rastreia a seleção de itens no menu de item pop-up. |
CMenu::TrackPopupMenuEx |
Exibe um menu pop-up flutuante no local especificado e rastreia a seleção de itens no menu de item pop-up. |
Operadores públicos
Nome | Descrição |
---|---|
CMenu::operator HMENU |
Recupera o identificador do objeto de menu. |
CMenu::operator != |
Determina se dois objetos de menu não são iguais. |
CMenu::operator == |
Determina se dois objetos de menu são iguais. |
Membros de Dados Públicos
Nome | Descrição |
---|---|
CMenu::m_hMenu |
Especifica o identificador no menu do Windows anexado ao objeto CMenu . |
Comentários
Ele fornece funções membro para criar, acompanhar, atualizar e destruir um menu.
Criar um objeto CMenu
no registro de ativação como um local e, em seguida, chamar as funções membro de CMenu
para manipular o novo menu conforme necessário. Em seguida, chame CWnd::SetMenu
para definir o menu como uma janela, seguido imediatamente por uma chamada para a função membro CMenu
do objeto Detach
. A função membro CWnd::SetMenu
define o menu da janela como o novo menu, faz com que a janela seja redesenhada para refletir a alteração do menu e também passa a propriedade do menu para a janela. A chamada para Detach
desanexa HMENU
do objeto CMenu
, assim quando a variável CMenu
local passa fora do escopo, o destruidor de objeto CMenu
não tenta destruir um menu que ele não possui mais. O menu é destruído automaticamente quando a janela é destruída.
Você pode usar a função membro LoadMenuIndirect
para criar um menu a partir de um modelo na memória, mas um menu criado a partir de um recurso por uma chamada para LoadMenu
é mantido com mais facilidade e o recurso de menu pode ser criado e modificado pelo editor de menus.
Hierarquia de herança
CMenu
Requisitos
Cabeçalho: afxwin.h
CMenu::AppendMenu
Acrescenta um novo item ao final de um menu.
BOOL AppendMenu(
UINT nFlags,
UINT_PTR nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL);
BOOL AppendMenu(
UINT nFlags,
UINT_PTR nIDNewItem,
const CBitmap* pBmp);
Parâmetros
nFlags
Especifica informações sobre o estado do novo item de menu quando ele é adicionado ao menu. Ele consiste em um ou mais dos valores listados na seção Comentários.
nIDNewItem
Especifica a ID de comando do novo item de menu ou, se nFlags
for definido como MF_POPUP
, o identificador de menu (HMENU
) de um menu de item pop-up. O parâmetro nIDNewItem
será ignorado (não necessário) se nFlags
for definido como MF_SEPARATOR
.
lpszNewItem
Especifica o conteúdo do novo item de menu. O parâmetro nFlags
é usado para interpretar lpszNewItem
da seguinte maneira:
nFlags |
Interpretação de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contém um valor de 32 bits fornecido pelo aplicativo que o aplicativo pode usar para manter dados adicionais associados ao item de menu. Esse valor de 32 bits está disponível para o aplicativo quando ele processa mensagens WM_MEASUREITEM e WM_DRAWITEM . O valor é armazenado no membro itemData da estrutura fornecida com essas mensagens. |
MF_STRING |
Contém um ponteiro para uma cadeia de caracteres terminada em nulo. Essa é a interpretação padrão. |
MF_SEPARATOR |
O parâmetro lpszNewItem será ignorado (não necessário). |
pBmp
Aponta para um objeto CBitmap
que será usado como o item de menu.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
O aplicativo pode especificar o estado do item de menu definindo valores em nFlags
. Quando nIDNewItem
especifica um menu de item pop-up, ele se torna parte do menu ao qual ele é acrescentado. Se esse menu for destruído, o menu acrescentado também será destruído. Um menu acrescentado deve ser desanexado de um objeto CMenu
para evitar conflitos. Observe que MF_STRING
e MF_OWNERDRAW
não são válidos para a versão bitmap de AppendMenu
.
A lista a seguir descreve os sinalizadores que podem ser definidos em nFlags
:
MF_CHECKED
Atua como um alternância paraMF_UNCHECKED
colocar a marca de seleção padrão próxima ao item. Quando o aplicativo fornece bitmaps de marca de seleção (consulte a função membroSetMenuItemBitmaps
), o bitmap "marca de seleção ativada" é exibido.MF_UNCHECKED
Atua como um alternância paraMF_CHECKED
remover uma marca de seleção próxima ao item. Quando o aplicativo fornece bitmaps de marca de seleção (consulte a função membroSetMenuItemBitmaps
), o bitmap "marca de seleção desativada" é exibido.MF_DISABLED
Desabilita o item de menu para que ele não possa ser selecionado, mas não o esmaece.MF_ENABLED
Habilita o item de menu para que ele possa ser selecionado e o restaura de seu estado esmaecido.MF_GRAYED
Desabilita o item de menu para que ele não possa ser selecionado e o esmaece.MF_MENUBARBREAK
Coloca o item em uma nova linha em menus estáticos ou em uma nova coluna em menus de item pop-up. A nova coluna de menu de item pop-up será separada da coluna antiga por uma linha divisória vertical.MF_MENUBREAK
Coloca o item em uma nova linha em menus estáticos ou em uma nova coluna em menus de item pop-up. Nenhuma linha divisória é colocada entre as colunas.MF_OWNERDRAW
Especifica que o item é um item de desenho de proprietário. Quando o menu é exibido pela primeira vez, a janela que possui o menu recebe uma mensagemWM_MEASUREITEM
, que recupera a altura e a largura do item de menu. A mensagemWM_DRAWITEM
é aquela enviada sempre que o proprietário deve atualizar a aparência visual do item de menu. Essa opção não é válida para um item de menu de nível superior.MF_POPUP
Especifica que o item de menu tem um menu de item pop-up associado a ele. O parâmetro da ID especifica um identificador para um menu de item pop-up que deve ser associado ao item. Isso é usado para adicionar um menu de item pop-up de nível superior ou um menu de item pop-up hierárquico a um item de menu de item pop-up.MF_SEPARATOR
Desenha uma linha divisória horizontal. Pode ser usada somente em um menu de item pop-up. Essa linha não pode ser esmaecida, desabilitada ou realçada. Outros parâmetros são ignorados.MF_STRING
Especifica que o item de menu é uma cadeia de caracteres.
Cada um dos seguintes grupos lista sinalizadores mutuamente exclusivos e que não podem ser usados em conjunto:
MF_DISABLED
,MF_ENABLED
eMF_GRAYED
MF_STRING
,MF_OWNERDRAW
,MF_SEPARATOR
e a versão do bitmapMF_MENUBARBREAK
eMF_MENUBREAK
MF_CHECKED
eMF_UNCHECKED
Sempre que um menu que reside em uma janela é alterado (exibindo ou não a janela), o aplicativo deve chamar CWnd::DrawMenuBar
.
Exemplo
Confira o exemplo de CMenu::CreateMenu
.
CMenu::Attach
Anexa um menu existente do Windows a um objeto CMenu
.
BOOL Attach(HMENU hMenu);
Parâmetros
hMenu
Especifica um identificador para um menu do Windows.
Valor de retorno
Diferente de zero se a operação foi bem-sucedida; caso contrário, 0.
Comentários
Essa função não deve ser chamada se um menu já estiver anexado ao objeto CMenu
. O identificador de menu é armazenado no membro de dados m_hMenu
.
Se o menu que você deseja manipular já estiver associado a uma janela, você pode usar a função CWnd::GetMenu
para obter um identificador no menu.
Exemplo
CMenu mnu;
HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
mnu.Attach(hmnu);
// Now you can manipulate the window's menu as a CMenu
// object...
mnu.Detach();
CMenu::CheckMenuItem
Adiciona ou remove marcas de seleção de itens de menu no menu de item pop-up.
UINT CheckMenuItem(
UINT nIDCheckItem,
UINT nCheck);
Parâmetros
nIDCheckItem
Especifica o item de menu a ser selecionado, conforme determinado por nCheck
.
nCheck
Especifica como selecionar o item de menu e como determinar a posição do item no menu. O parâmetro nCheck
pode ser uma combinação de MF_CHECKED
ou MF_UNCHECKED
com sinalizadores MF_BYPOSITION
ou MF_BYCOMMAND
. Esses sinalizadores podem ser combinados usando o operador bit a bit OR. Eles têm os seguintes significados:
MF_BYCOMMAND
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão.MF_BYPOSITION
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0.MF_CHECKED
Atua como um alternância paraMF_UNCHECKED
colocar a marca de seleção padrão próxima ao item.MF_UNCHECKED
Atua como um alternância paraMF_CHECKED
remover uma marca de seleção próxima ao item.
Valor de retorno
O estado anterior do item: MF_CHECKED
, MF_UNCHECKED
, ou 0xFFFFFFFF
caso o item de menu não exista.
Comentários
O parâmetro nIDCheckItem
especifica o item a ser modificado.
O parâmetro nIDCheckItem
pode identificar um item de menu de item pop-up, bem como um item de menu. Nenhuma etapa especial é necessária para verificar um item de menu de item pop-up. Itens de menu de nível superior não podem ser selecionados. Um item de menu de item pop-up deve ser selecionado por posição, pois ele não tem um identificador de item de menu associado a ele.
Exemplo
Confira o exemplo de CMenu::GetMenuState
.
CMenu::CheckMenuRadioItem
Seleciona um item de menu especificado e o torna um item de opção.
BOOL CheckMenuRadioItem(
UINT nIDFirst,
UINT nIDLast,
UINT nIDItem,
UINT nFlags);
Parâmetros
nIDFirst
Especifica (como uma ID ou deslocamento, dependendo do valor de nFlags
) o primeiro item de menu no grupo de botões de opção.
nIDLast
Especifica (como uma ID ou deslocamento, dependendo do valor de nFlags
) o último item de menu no grupo de botões de opção.
nIDItem
Especifica (como uma ID ou deslocamento, dependendo do valor de nFlags
) o item no grupo que será selecionado com um botão de opção.
nFlags
Especifica a interpretação de nIDFirst
, nIDLast
e nIDItem
da seguinte maneira:
nFlags | Interpretação |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
Valor de retorno
Diferente de zero se tiver êxito. Caso contrário, 0
Comentários
Ao mesmo tempo, a função desmarca todos os outros itens de menu no grupo associado e limpa o sinalizador de tipo de item de opção para esses itens. O item selecionado é exibido usando um bitmap de botão de opção (ou marcador) em vez de um bitmap de marca de seleção.
Exemplo
Confira o exemplo de ON_COMMAND_RANGE
.
CMenu::CMenu
Cria um menu vazio e o anexa a um objeto CMenu
.
CMenu();
Comentários
O menu não é criado até que você chame uma das funções membro de criação ou carregamento de CMenu
:
CMenu::CreateMenu
Cria um menu e o anexa ao objeto CMenu
.
BOOL CreateMenu();
Valor de retorno
Diferente de zero se o menu foi criado com êxito. Caso contrário, 0.
Comentários
O menu inicialmente está vazio. Itens de menu podem ser adicionados usando a função membro AppendMenu
ou InsertMenu
.
Se o menu estiver atribuído a uma janela, ele será destruído automaticamente quando a janela é destruída.
Antes de sair, um aplicativo deve liberar recursos do sistema associados a um menu se o menu não estiver atribuído a uma janela. Um aplicativo libera um menu chamando a função membro DestroyMenu
.
Exemplo
// The code fragment below shows how to create a new menu for the
// application window using CreateMenu() and CreatePopupMenu().
// Then, the created menu will replace the current menu of the
// application. The old menu will be destroyed with DestroyMenu().
// NOTE: The code fragment below is done in a CFrameWnd-derived class.
// Create a new menu for the application window.
VERIFY(m_NewMenu.CreateMenu());
// Create a "File" popup menu and insert this popup menu to the
// new menu of the application window. The "File" menu has only
// one menu item, i.e. "Exit".
VERIFY(m_FileMenu.CreatePopupMenu());
m_FileMenu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("E&xit"));
m_NewMenu.AppendMenu(MF_POPUP, (UINT_PTR)m_FileMenu.m_hMenu, _T("&File"));
// Remove and destroy old menu
SetMenu(NULL);
CMenu *old_menu = CMenu::FromHandle(m_hMenuDefault);
old_menu->DestroyMenu();
// Add new menu.
SetMenu(&m_NewMenu);
// Assign default menu
m_hMenuDefault = m_NewMenu.m_hMenu;
CMenu::CreatePopupMenu
Cria um menu de item pop-up e o anexa ao objeto CMenu
.
BOOL CreatePopupMenu();
Valor de retorno
Diferente de zero se o menu de item pop-up foi criado com êxito. Caso contrário, 0.
Comentários
O menu inicialmente está vazio. Itens de menu podem ser adicionados usando a função membro AppendMenu
ou InsertMenu
. O aplicativo pode adicionar o menu de item pop-up a um menu ou menu de item pop-up existente. A função membro TrackPopupMenu
pode ser usada para exibir esse menu como um menu de item pop-up flutuante e para acompanhar seleções no menu de item pop-up.
Se o menu estiver atribuído a uma janela, ele será destruído automaticamente quando a janela é destruída. Se o menu for adicionado a um menu existente, ele será destruído automaticamente quando esse menu for destruído.
Antes de sair, um aplicativo deve liberar recursos do sistema associados a um menu de item pop-up se o menu não estiver atribuído a uma janela. Um aplicativo libera um menu chamando a função membro DestroyMenu
.
Exemplo
Confira o exemplo de CMenu::CreateMenu
.
CMenu::DeleteMenu
Exclui um item do menu.
BOOL DeleteMenu(
UINT nPosition,
UINT nFlags);
Parâmetros
nPosition
Especifica o item de menu que será excluído, conforme determinado por nFlags
.
nFlags
É usado para interpretar nPosition
da seguinte maneira:
nFlags |
Interpretação de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
Se o item de menu tiver um menu de item pop-up associado, DeleteMenu
destruirá o identificador do menu de item pop-up e liberará a memória usada pelo menu de item pop-up.
Sempre que um menu que reside em uma janela é alterado (exibindo ou não a janela), o aplicativo pode chamar CWnd::DrawMenuBar
.
Exemplo
Confira o exemplo de CWnd::GetMenu
.
CMenu::DeleteTempMap
Chamado automaticamente pelo manipulador de tempo ocioso CWinApp
, exclui todos os objetos CMenu
temporários criados pela função membro FromHandle
.
static void PASCAL DeleteTempMap();
Comentários
DeleteTempMap
desanexa o objeto de menu do Windows anexado a um objeto CMenu
temporário antes de excluir o objeto CMenu
.
Exemplo
// DeleteTempMap() is a static member and does not need
// an instantiated CMenu object.
CMenu::DeleteTempMap();
CMenu::DestroyMenu
Destrói o menu e todos os recursos do Windows que foram usados.
BOOL DestroyMenu();
Valor de retorno
Diferente de zero se o menu for destruído, Caso contrário, 0.
Comentários
O menu é desanexado do objeto CMenu
antes de ser destruído. A função DestroyMenu
do Windows é chamada automaticamente no destruidor CMenu
.
Exemplo
Confira o exemplo de CMenu::CreateMenu
.
CMenu::Detach
Desanexa um menu do Windows de um objeto CMenu
e retorna o identificador.
HMENU Detach();
Valor de retorno
O identificador, de tipo HMENU
para um menu do Windows, se bem-sucedido. Caso contrário NULL
.
Comentários
O membro de dados m_hMenu
está definido como NULL
.
Exemplo
CMenu mnu;
HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
mnu.Attach(hmnu);
// Now you can manipulate the window's menu as a CMenu
// object...
mnu.Detach();
CMenu::DrawItem
Chamado pela estrutura quando um aspecto visual de um menu desenhado pelo proprietário é alterado.
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
Parâmetros
lpDrawItemStruct
Um ponteiro para uma estrutura DRAWITEMSTRUCT
que contém informações sobre o tipo de desenho necessário.
Comentários
O membro itemAction
da estrutura DRAWITEMSTRUCT
define a ação de desenho a ser executada. Substitua essa função de membro para implementar o desenho para um objeto CMenu
desenhado pelo proprietário. O aplicativo deverá restaurar todos os objetos GDI (Graphics Device Interface) selecionados para o contexto de exibição fornecido em lpDrawItemStruct
antes do encerramento dessa função membro.
Confira CWnd::OnDrawItem
para uma descrição da estrutura DRAWITEMSTRUCT
.
Exemplo
O código a seguir é da amostra CTRLTEST
do MFC:
// Override DrawItem() to implement drawing for an owner-draw CMenu object.
// CColorMenu is a CMenu-derived class.
void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC *pDC = CDC::FromHandle(lpDIS->hDC);
COLORREF cr = (COLORREF)lpDIS->itemData; // RGB in item data
if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
// Paint the color item in the color requested
CBrush br(cr);
pDC->FillRect(&lpDIS->rcItem, &br);
}
if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
// item has been selected - hilite frame
COLORREF crHilite = RGB(255 - GetRValue(cr),
255 - GetGValue(cr), 255 - GetBValue(cr));
CBrush br(crHilite);
pDC->FrameRect(&lpDIS->rcItem, &br);
}
if (!(lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & ODA_SELECT))
{
// Item has been de-selected -- remove frame
CBrush br(cr);
pDC->FrameRect(&lpDIS->rcItem, &br);
}
}
CMenu::EnableMenuItem
Habilita, desabilita ou esmaece um item de menu.
UINT EnableMenuItem(
UINT nIDEnableItem,
UINT nEnable);
Parâmetros
nIDEnableItem
Especifica o item de menu a ser habilitado, conforme determinado por nEnable
. Esse parâmetro pode especificar itens de menu pop-up, bem como itens de menu padrão.
nEnable
Especifica a ação a ser tomada. Pode ser uma combinação de MF_DISABLED
, MF_ENABLED
ou MF_GRAYED
com MF_BYCOMMAND
ou MF_BYPOSITION
. Esses valores podem ser combinados usando o operador OR bit a bit C++ (|
). Esses valores têm estes significados:
MF_BYCOMMAND
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão.MF_BYPOSITION
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0.MF_DISABLED
Desabilita o item de menu para que ele não possa ser selecionado, mas não o esmaece.MF_ENABLED
Habilita o item de menu para que ele possa ser selecionado e o restaura de seu estado esmaecido.MF_GRAYED
Desabilita o item de menu para que ele não possa ser selecionado e o esmaece.
Valor de retorno
Estado anterior (MF_DISABLED
, MF_ENABLED
ou MF_GRAYED
) ou -1, se não for válido.
Comentários
As funções membro CreateMenu
, InsertMenu
, ModifyMenu
e LoadMenuIndirect
também podem definir o estado (habilitado, desabilitado ou esmaecido) de um item de menu.
Usar o valor MF_BYPOSITION
requer um aplicativo para usar o CMenu
correto. Se o CMenu
da barra de menus for usado, um item de menu de nível superior (um item na barra de menus) será afetado. Para definir o estado de um item em um menu de item pop-up ou item pop-up aninhado por posição, um aplicativo deve especificar o CMenu
do menu de item pop-up.
Quando um aplicativo especifica o sinalizador MF_BYCOMMAND
, o Windows marca todos os itens de menu de item pop-up subordinados ao CMenu
; portanto, é o bastante usar o CMenu
da barra de menus, a menos que existam itens de menu duplicados.
Exemplo
// The code fragment below shows how to disable (and gray out) the
// File\New menu item.
// NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of
// CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are
// needed, and CMenu::EnableMenuItem() will work as expected.
CMenu *mmenu = GetMenu();
CMenu *submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
CMenu::FromHandle
Retorna um ponteiro para um objeto CMenu
, dado um identificador do Windows para um menu.
static CMenu* PASCAL FromHandle(HMENU hMenu);
Parâmetros
hMenu
Um identificador do Windows para um menu.
Valor de retorno
Um ponteiro para um CMenu
que pode ser temporário ou permanente.
Comentários
Se um objeto CMenu
não estiver anexado ao objeto de menu do Windows, um objeto CMenu
temporário será criado e anexado.
Esse objeto CMenu
temporário é válido somente até a próxima vez que o aplicativo tiver tempo ocioso em seu loop de eventos, momento em que todos os objetos temporários são excluídos.
Exemplo
Confira o exemplo de CMenu::CreateMenu
.
CMenu::GetDefaultItem
Determina o item de menu padrão no menu especificado.
UINT GetDefaultItem(
UINT gmdiFlags,
BOOL fByPos = FALSE);
Parâmetros
gmdiFlags
Valor que especifica como a função procura itens de menu. Esse parâmetro pode ser nenhum, um ou uma combinação dos seguintes valores:
Valor | Significado |
---|---|
GMDI_GOINTOPOPUPS |
Especifica que, se o item padrão for aquele que abre um submenu, a função servirá para pesquisar no submenu correspondente recursivamente. Se o submenu não tiver nenhum item padrão, o valor retornado identificará o item que abre o submenu. Por padrão, a função retorna o primeiro item padrão no menu especificado, independentemente de ser um item que abre um submenu. |
GMDI_USEDISABLED |
Especifica que a função deve retornar um item padrão, mesmo que esteja desabilitada. Por padrão, a função ignora itens desabilitados ou esmaecidos. |
fByPos
Valor que especifica se deve ser recuperado o identificador do item de menu ou sua posição. Se esse parâmetro for FALSE
, o identificador será retornado. Caso contrário, a posição será retornada.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será o identificador ou a posição do item de menu. Se a função falhar, o valor retornado será - 1.
Comentários
Essa função membro implementa o comportamento da função do Win32 GetMenuDefaultItem
, conforme descrito no SDK do Windows.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::GetMenuContextHelpId
Recupera a ID de ajuda de contexto associada ao CMenu
.
DWORD GetMenuContextHelpId() const;
Valor de retorno
A ID de ajuda de contexto atualmente associada ao CMenu
se ele tiver uma. Caso contrário, zero.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::GetMenuInfo
Recupera informações para um menu.
BOOL GetMenuInfo(LPMENUINFO lpcmi) const;
Parâmetros
lpcmi
Um ponteiro para uma estrutura MENUINFO
que contém informações para o menu.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será diferente de zero. Caso contrário, o valor retornado será zero.
Comentários
Chamar essa função para recuperar informações sobre o menu.
CMenu::GetMenuItemCount
Determina o número de itens em um menu de item pop-up ou de nível superior.
UINT GetMenuItemCount() const;
Valor de retorno
O número de itens no menu se a função for bem-sucedida. Caso contrário, -1.
Exemplo
Confira o exemplo de CWnd::GetMenu
.
CMenu::GetMenuItemID
Obtém o identificador de item de menu para um item de menu localizado na posição definida por nPos
.
UINT GetMenuItemID(int nPos) const;
Parâmetros
nPos
Especifica a posição (baseada em zero) do item de menu cuja ID está sendo recuperada.
Valor de retorno
A ID do item especificado em um menu de item pop-up se a função for bem-sucedida. Se o item especificado for um menu de item pop-up (em vez de um item no menu de item pop-up), o valor retornado será -1. Se nPos
corresponder a um item de menu SEPARATOR
, o valor retornado será 0.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::GetMenuItemInfo
Recupera informações sobre um item de menu.
BOOL GetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parâmetros
uItem
Identificador ou posição do item de menu sobre o qual obter informações. O significado desse parâmetro depende do valor de ByPos
.
lpMenuItemInfo
Um ponteiro para um MENUITEMINFO
, conforme descrito no SDK do Windows, que contém informações sobre o menu.
fByPos
Valor que especifica o significado de nIDItem
. Por padrão, ByPos
é FALSE
, o que indica que uItem é um identificador de item de menu. Se ByPos
não for definido como FALSE
, ele indicará uma posição de item de menu.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será diferente de zero. Se a função falhar, o valor retornado será zero. Para obter informações de erro estendidas, use a função do Win32 GetLastError
, conforme descrito no SDK do Windows.
Comentários
Essa função membro implementa o comportamento da função do Win32 GetMenuItemInfo
, conforme descrito no SDK do Windows. Observe que, na implementação de GetMenuItemInfo
do MFC, você não usa um identificador para um menu.
Exemplo
// CMainFrame::OnToggleTestMenuInfo() is a menu command handler for
// "Toggle Info" menu item (whose resource id is ID_MENU_TOGGLEINFO). It
// toggles the checked or unchecked state of the "Toggle Info" menu item.
// CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnToggleTestMenuItemInfo()
{
// Get the popup menu which contains the "Toggle Info" menu item.
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(4);
// Check the state of the "Toggle Info" menu item. Check the menu item
// if it is currently unchecked. Otherwise, uncheck the menu item
// if it is not currently checked.
MENUITEMINFO info;
info.cbSize = sizeof (MENUITEMINFO); // must fill up this field
info.fMask = MIIM_STATE; // get the state of the menu item
VERIFY(submenu->GetMenuItemInfo(ID_MENU_TOGGLEINFO, &info));
if (info.fState & MF_CHECKED)
submenu->CheckMenuItem(ID_MENU_TOGGLEINFO, MF_UNCHECKED | MF_BYCOMMAND);
else
submenu->CheckMenuItem(ID_MENU_TOGGLEINFO, MF_CHECKED | MF_BYCOMMAND);
}
CMenu::GetMenuState
Retorna o status do item de menu especificado ou o número de itens em um menu de item pop-up.
UINT GetMenuState(
UINT nID,
UINT nFlags) const;
Parâmetros
nID
Especifica a ID do item de menu, conforme determinado por nFlags
.
nFlags
Especifica a natureza de nID
. Pode ser um dos seguintes valores:
MF_BYCOMMAND
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão.MF_BYPOSITION
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0.
Valor de retorno
O valor 0xFFFFFFFF
, se o item especificado não existir. Se nId
identificar um menu de item pop-up, o byte de ordem superior conterá o número de itens no menu de item pop-up e o byte de ordem inferior conterá os sinalizadores de menu associados ao menu de item pop-up. Caso contrário, o valor retornado é uma máscara (Booliano OR) dos valores da lista a seguir (essa máscara descreve o status do item de menu que nId
identifica):
MF_CHECKED
Atua como um alternância paraMF_UNCHECKED
colocar a marca de seleção padrão próxima ao item. Quando o aplicativo fornece bitmaps de marca de seleção (consulte a função membroSetMenuItemBitmaps
), o bitmap "marca de seleção ativada" é exibido.MF_DISABLED
Desabilita o item de menu para que ele não possa ser selecionado, mas não o esmaece.MF_ENABLED
Habilita o item de menu para que ele possa ser selecionado e o restaura de seu estado esmaecido. Observe que o valor dessa constante é 0. Um aplicativo não deve testar contra 0 para falha ao usar esse valor.MF_GRAYED
Desabilita o item de menu para que ele não possa ser selecionado e o esmaece.MF_MENUBARBREAK
Coloca o item em uma nova linha em menus estáticos ou em uma nova coluna em menus de item pop-up. A nova coluna de menu de item pop-up será separada da coluna antiga por uma linha divisória vertical.MF_MENUBREAK
Coloca o item em uma nova linha em menus estáticos ou em uma nova coluna em menus de item pop-up. Nenhuma linha divisória é colocada entre as colunas.MF_SEPARATOR
Desenha uma linha divisória horizontal. Pode ser usada somente em um menu de item pop-up. Essa linha não pode ser esmaecida, desabilitada ou realçada. Outros parâmetros são ignorados.MF_UNCHECKED
Atua como um alternância paraMF_CHECKED
remover uma marca de seleção próxima ao item. Quando o aplicativo fornece bitmaps de marca de seleção (consulte a função membroSetMenuItemBitmaps
), o bitmap "marca de seleção desativada" é exibido. Observe que o valor dessa constante é 0. Um aplicativo não deve testar contra 0 para falha ao usar esse valor.
Exemplo
// CMainFrame::OnToggleTestMenuState() is a menu command handler for
// "Toggle State" menu item (whose resource id is ID_MENU_TOGGLESTATE).
// It toggles the checked or unchecked state of the "Toggle State" menu item.
// CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnToggleTestMenuState()
{
// Get the popup menu which contains the "Toggle State" menu item.
CMenu *mmenu = GetMenu();
CMenu *submenu = mmenu->GetSubMenu(4);
// Check the state of the "Toggle State" menu item. Check the menu item
// if it is currently unchecked. Otherwise, uncheck the menu item
// if it is not currently checked.
UINT state = submenu->GetMenuState(ID_MENU_TOGGLESTATE, MF_BYCOMMAND);
ASSERT(state != 0xFFFFFFFF);
if (state & MF_CHECKED)
submenu->CheckMenuItem(ID_MENU_TOGGLESTATE, MF_UNCHECKED | MF_BYCOMMAND);
else
submenu->CheckMenuItem(ID_MENU_TOGGLESTATE, MF_CHECKED | MF_BYCOMMAND);
}
CMenu::GetMenuString
Copia o rótulo do item de menu especificado para o buffer especificado.
int GetMenuString(
UINT nIDItem,
LPTSTR lpString,
int nMaxCount,
UINT nFlags) const;
int GetMenuString(
UINT nIDItem,
CString& rString,
UINT nFlags) const;
Parâmetros
nIDItem
Especifica o identificador inteiro do item de menu ou o deslocamento do item de menu no menu, dependendo do valor de nFlags
.
lpString
Aponta para o buffer que deve receber o rótulo.
rString
Uma referência a um objeto CString
que deve receber a cadeia de caracteres de menu copiada.
nMaxCount
Especifica o comprimento máximo (em caracteres) do rótulo que será copiado. Se o rótulo for maior que o máximo especificado em nMaxCount
, os caracteres extras serão truncados.
nFlags
Especifica a interpretação do parâmetro nIDItem
. Pode ser um dos seguintes valores:
nFlags |
Interpretação de nIDItem |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
Valor de retorno
Especifica o número real de caracteres copiados para o buffer, sem incluir o terminador nulo.
Comentários
O parâmetro nMaxCount
deve ser um maior que o número de caracteres no rótulo para acomodar o caractere nulo que termina uma cadeia de caracteres.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::GetSafeHmenu
Retorna o HMENU
encapsulamento por este CMenu
objeto ou um NULL
CMenu
ponteiro.
HMENU GetSafeHmenu() const;
Exemplo
Confira o exemplo de CMenu::LoadMenu
.
CMenu::GetSubMenu
Recupera o objeto CMenu
de um menu de item pop-up.
CMenu* GetSubMenu(int nPos) const;
Parâmetros
nPos
Especifica a posição do menu de item pop-up contido no menu. Os valores de posição começam em 0 para o primeiro item de menu. O identificador do menu de item pop-up não pode ser usado nessa função.
Valor de retorno
Um ponteiro para um objeto CMenu
cujo membro m_hMenu
contém um identificador para o menu de item pop-up, caso exista um menu de item pop-up na posição determinada. Caso contrário NULL
. Se um objeto CMenu
não existir, será criado um temporário. O ponteiro CMenu
retornado não deve ser armazenado.
Exemplo
Confira o exemplo de CMenu::TrackPopupMenu
.
CMenu::InsertMenu
Insere um novo item de menu na posição especificada por nPosition
e move outros itens ao longo do menu.
BOOL InsertMenu(
UINT nPosition,
UINT nFlags,
UINT_PTR nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL);
BOOL InsertMenu(
UINT nPosition,
UINT nFlags,
UINT_PTR nIDNewItem,
const CBitmap* pBmp);
Parâmetros
nPosition
Especifica o item de menu antes do qual o novo item de menu deve ser inserido. O parâmetro nFlags
pode ser usado para interpretar nPosition
das seguintes maneiras:
nFlags |
Interpretação de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. Se nPosition for -1, o novo item de menu será acrescentado ao final do menu. |
nFlags
Especifica como nPosition
é interpretado e as informações sobre o estado do novo item de menu quando ele é adicionado ao menu. Para obter uma lista dos sinalizadores que podem ser definidos, consulte a função membro AppendMenu
. Para especificar mais de um valor, use o operador bit a bit OR para combiná-los com o sinalizador MF_BYCOMMAND
ou MF_BYPOSITION
.
nIDNewItem
Especifica a ID de comando do novo item de menu ou, se nFlags
for definido como MF_POPUP
, o identificador de menu (HMENU
) do menu de item pop-up. O parâmetro nIDNewItem
será ignorado (não necessário) se nFlags
for definido como MF_SEPARATOR
.
lpszNewItem
Especifica o conteúdo do novo item de menu. lpszNewItem
pode ser usado para interpretar nFlags
das seguintes maneiras:
nFlags |
Interpretação de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contém um valor de 32 bits fornecido pelo aplicativo que o aplicativo pode usar para manter dados adicionais associados ao item de menu. Esse valor de 32 bits está disponível para o aplicativo no membro itemData da estrutura fornecida pelas mensagens WM_MEASUREITEM e WM_DRAWITEM . Essas mensagens são enviadas quando o item de menu é exibido inicialmente ou alterado. |
MF_STRING |
Contém um ponteiro longo para uma cadeia de caracteres terminada em nulo. Essa é a interpretação padrão. |
MF_SEPARATOR |
O parâmetro lpszNewItem será ignorado (não necessário). |
pBmp
Aponta para um objeto CBitmap
que será usado como o item de menu.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
O aplicativo pode especificar o estado do item de menu definindo valores em nFlags
.
Sempre que um menu que reside em uma janela é alterado (exibindo ou não a janela), o aplicativo deve chamar CWnd::DrawMenuBar
.
Quando nIDNewItem
especifica um menu de item pop-up, ele se torna parte do menu no qual ele é inserido. Se esse menu for destruído, o menu inserido também será destruído. Um menu inserido deve ser desanexado de um objeto CMenu
para evitar conflitos.
Se a janela filho da MDI (interface de vários documentos) ativa for maximizada e um aplicativo inserir um menu de item pop-up no menu do aplicativo da MDI chamando essa função e especificando o sinalizador MF_BYPOSITION
, o menu será inserido uma posição mais à esquerda do que o esperado. Isso acontece porque o menu Controle da janela filho da MDI ativa é inserido na primeira posição da barra de menus da janela de quadro da MDI. Para posicionar o menu corretamente, o aplicativo deve adicionar 1 ao valor de posição que seria usado, caso contrário. Um aplicativo pode usar a mensagem WM_MDIGETACTIVE
para determinar se a janela filho ativa no momento está maximizada.
Exemplo
// CMainFrame::OnChangeFileMenu() is a menu command handler for
// CMainFrame class, which in turn is a CFrameWnd-derived class.
// It modifies the File menu by inserting, removing and renaming
// some menu items. Other operations include associating a context
// help id and setting default menu item to the File menu.
// CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnChangeFileMenu()
{
// Get the menu from the application window.
CMenu *mmenu = GetMenu();
// Look for "File" menu.
int pos = FindMenuItem(mmenu, _T("&File"));
if (pos == -1)
return;
// Remove "New" menu item from the File menu.
CMenu *submenu = mmenu->GetSubMenu(pos);
pos = FindMenuItem(submenu, _T("&New\tCtrl+N"));
if (pos > -1)
submenu->RemoveMenu(pos, MF_BYPOSITION);
// Look for "Open" menu item from the File menu. Insert a new
// menu item called "Close" right after the "Open" menu item.
// ID_CLOSEFILE is the command id for the "Close" menu item.
pos = FindMenuItem(submenu, _T("&Open...\tCtrl+O"));
if (pos > -1)
submenu->InsertMenu(pos + 1, MF_BYPOSITION, ID_CLOSEFILE, _T("&Close"));
// Rename menu item "Exit" to "Exit Application".
pos = FindMenuItem(submenu, _T("E&xit"));
if (pos > -1)
{
UINT id = submenu->GetMenuItemID(pos);
submenu->ModifyMenu(id, MF_BYCOMMAND, id, _T("E&xit Application"));
}
// Associate a context help ID with File menu, if one is not found.
// ID_FILE_CONTEXT_HELPID is the context help ID for the File menu
// that is defined in resource file.
if (submenu->GetMenuContextHelpId() == 0)
submenu->SetMenuContextHelpId(ID_FILE_CONTEXT_HELPID);
// Set "Open" menu item as the default menu item for the File menu,
// if one is not found. So, when a user double-clicks the File
// menu, the system sends a command message to the menu's owner
// window and closes the menu as if the File\Open command item had
// been chosen.
if (submenu->GetDefaultItem(GMDI_GOINTOPOPUPS, TRUE) == -1)
{
pos = FindMenuItem(submenu, _T("&Open...\tCtrl+O"));
submenu->SetDefaultItem(pos, TRUE);
}
}
// FindMenuItem() will find a menu item string from the specified
// popup menu and returns its position (0-based) in the specified
// popup menu. It returns -1 if no such menu item string is found.
int FindMenuItem(CMenu *Menu, LPCTSTR MenuString)
{
ASSERT(Menu);
ASSERT(::IsMenu(Menu->GetSafeHmenu()));
int count = Menu->GetMenuItemCount();
for (int i = 0; i < count; i++)
{
CString str;
if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
str.Compare(MenuString) == 0)
return i;
}
return -1;
}
CMenu::InsertMenuItem
Insere um novo item de menu na posição especificada em um menu.
BOOL InsertMenuItem(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parâmetros
uItem
Confira a descrição de uItem
no InsertMenuItem
do SDK do Windows.
lpMenuItemInfo
Confira a descrição de lpmii
no InsertMenuItem
do SDK do Windows.
fByPos
Confira a descrição de fByPosition
no InsertMenuItem
do SDK do Windows.
Comentários
Essa função encapsula InsertMenuItem
, descrita no SDK do Windows.
CMenu::LoadMenu
Carrega um recurso de menu do arquivo executável do aplicativo e o anexa ao objeto CMenu
.
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);
Parâmetros
lpszResourceName
Aponta para uma cadeia de caracteres terminada em nulo que contém o nome do recurso de menu que será carregado.
nIDResource
Especifica a ID do menu do recurso de menu que será carregado.
Valor de retorno
Diferente de zero se o recurso de menu foi carregado com êxito. Caso contrário, 0.
Comentários
Antes de sair, um aplicativo deve liberar recursos do sistema associados a um menu se o menu não estiver atribuído a uma janela. Um aplicativo libera um menu chamando a função membro DestroyMenu
.
Exemplo
// CMainFrame::OnReplaceMenu() is a menu command handler for CMainFrame
// class, which in turn is a CFrameWnd-derived class. It loads a new
// menu resource and replaces the SDI application window's menu bar with
// this new menu. CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnReplaceMenu()
{
// Load the new menu.
m_ShortMenu.LoadMenu(IDR_SHORT_MENU);
ASSERT(m_ShortMenu);
// Remove and destroy the old menu
SetMenu(NULL);
::DestroyMenu(m_hMenuDefault);
// Add the new menu
SetMenu(&m_ShortMenu);
// Assign default menu
m_hMenuDefault = m_ShortMenu.GetSafeHmenu(); // or m_ShortMenu.m_hMenu;
}
CMenu::LoadMenuIndirect
Carrega um recurso de um modelo de menu na memória e o anexa ao objeto CMenu
.
BOOL LoadMenuIndirect(const void* lpMenuTemplate);
Parâmetros
lpMenuTemplate
Aponta para um modelo de menu (que é uma estrutura MENUITEMTEMPLATEHEADER
única e uma coleção de uma ou mais estruturas MENUITEMTEMPLATE
). Para obter mais informações sobre essas duas estruturas, consulte o SDK do Windows.
Valor de retorno
Diferente de zero se o recurso de menu foi carregado com êxito. Caso contrário, 0.
Comentários
Um modelo de menu é um cabeçalho seguido por uma coleção de uma ou mais estruturas MENUITEMTEMPLATE
, cada uma delas pode conter um ou mais itens de menu e menus de item pop-up.
O número da versão deve ser 0.
Os sinalizadores mtOption
devem incluir MF_END
para o último item em uma lista de item pop-up e para o último item na lista principal. Consulte a função de membro AppendMenu
para obter outros sinalizadores. O membro mtId
deve ser omitido da estrutura MENUITEMTEMPLATE
quando MF_POPUP
for especificado em mtOption
.
O espaço alocado para a estrutura MENUITEMTEMPLATE
deve ser grande o suficiente para mtString
conter o nome do item de menu como uma cadeia de caracteres terminada em nulo.
Antes de sair, um aplicativo deve liberar recursos do sistema associados a um menu se o menu não estiver atribuído a uma janela. Um aplicativo libera um menu chamando a função membro DestroyMenu
.
Exemplo
// CMainFrame::OnLoadMenuIndirect() is a menu command handler for
// CMainFrame class, which in turn is a CFrameWnd-derived class. It
// shows how to use LoadMenuIndirect() to load a resource from a
// menu template in memory.
void CMainFrame::OnLoadMenuIndirect()
{
// For simplicity, allocate 500 bytes from stack. May use
// GlobalAlloc() to allocate memory bytes from heap.
BYTE milist[500];
memset(milist, 0, 500);
int bytes_left = sizeof(milist);
// Fill up the MENUITEMTEMPLATEHEADER structure.
MENUITEMTEMPLATEHEADER *mheader = (MENUITEMTEMPLATEHEADER*)milist;
mheader->versionNumber = 0;
mheader->offset = 0;
int bytes_used = sizeof(MENUITEMTEMPLATEHEADER);
bytes_left -= bytes_used;
// Add the following menu items to menu bar:
// File Edit
// Exit Copy
// Paste
bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&File", 0,
TRUE, FALSE);
bytes_left -= bytes_used;
bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"E&xit",
ID_APP_EXIT, FALSE, TRUE);
bytes_left -= bytes_used;
bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Edit", 0,
TRUE, TRUE);
bytes_left -= bytes_used;
bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Copy",
ID_EDIT_COPY, FALSE, FALSE);
bytes_left -= bytes_used;
bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Paste",
ID_EDIT_PASTE, FALSE, TRUE);
bytes_left -= bytes_used;
// Load resource from a menu template in memory.
ASSERT(m_IndiMenu.LoadMenuIndirect(milist));
// Remove and destroy old menu
SetMenu(NULL);
::DestroyMenu(m_hMenuDefault);
// Add new menu.
SetMenu(&m_IndiMenu);
// Assign default menu
m_hMenuDefault = m_IndiMenu.m_hMenu;
}
// This is a helper function for adding a menu item (either a popup
// or command item) to the specified menu template.
//
// MenuTemplate - pointer to a menu template
// TemplateBytes - space remaining in MenuTemplate
// MenuString - string for the menu item to be added
// MenuID - id for the command item. Its value is ignored if
// IsPopup is TRUE.
// IsPopup - TRUE for popup menu (or submenu); FALSE for command
// item
// LastItem - TRUE if MenuString is the last item for the popup;
// FALSE otherwise.
UINT AddMenuItem(LPVOID MenuTemplate, int TemplateBytes, WCHAR *MenuString,
WORD MenuID, BOOL IsPopup, BOOL LastItem)
{
MENUITEMTEMPLATE *mitem = (MENUITEMTEMPLATE*)MenuTemplate;
UINT bytes_used = 0;
if (IsPopup) // for popup menu
{
if (LastItem)
mitem->mtOption = MF_POPUP | MF_END;
else
mitem->mtOption = MF_POPUP;
bytes_used += sizeof(mitem->mtOption);
mitem = (MENUITEMTEMPLATE*)((BYTE*)MenuTemplate + bytes_used);
// a popup doesn't have mtID!!!
TemplateBytes -= bytes_used;
wcscpy_s((WCHAR*)mitem, TemplateBytes / sizeof(WCHAR), MenuString);
bytes_used += (UINT)(sizeof(WCHAR) * (wcslen(MenuString) + 1)); // include '\0'
}
else // for command item
{
mitem->mtOption = LastItem ? MF_END : 0;
mitem->mtID = MenuID;
TemplateBytes -= bytes_used;
wcscpy_s(mitem->mtString, TemplateBytes / sizeof(WCHAR), MenuString);
bytes_used += (UINT)(sizeof(mitem->mtOption) + sizeof(mitem->mtID) +
sizeof(WCHAR) * (wcslen(MenuString) + 1)); // include '\0'
}
return bytes_used;
}
CMenu::m_hMenu
Especifica o identificador HMENU
no menu do Windows anexado ao objeto CMenu
.
HMENU m_hMenu;
Exemplo
Confira o exemplo de CMenu::LoadMenu
.
CMenu::MeasureItem
Chamado pela estrutura quando um menu com um estilo de desenho do proprietário é criado.
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
Parâmetros
lpMeasureItemStruct
Um ponteiro para uma estrutura MEASUREITEMSTRUCT
.
Comentários
Por padrão, essa função membro não faz nada. Substitua essa função de membro e preencha a estrutura MEASUREITEMSTRUCT
para informar o Windows sobre as dimensões do menu.
Confira CWnd::OnMeasureItem
para uma descrição da estrutura MEASUREITEMSTRUCT
.
Exemplo
O código a seguir é da amostra CTRLTEST
do MFC:
// Override MeasureItem() to return the size of the menu item.
// CColorMenu is a CMenu-derived class.
#define COLOR_BOX_WIDTH 20
#define COLOR_BOX_HEIGHT 20
void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
// all items are of fixed size
lpMIS->itemWidth = COLOR_BOX_WIDTH;
lpMIS->itemHeight = COLOR_BOX_HEIGHT;
}
CMenu::ModifyMenu
Altera um item de menu existente na posição especificada por nPosition
.
BOOL ModifyMenu(
UINT nPosition,
UINT nFlags,
UINT_PTR nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL);
BOOL ModifyMenu(
UINT nPosition,
UINT nFlags,
UINT_PTR nIDNewItem,
const CBitmap* pBmp);
Parâmetros
nPosition
Especifica o item de menu que será alterado. O parâmetro nFlags
pode ser usado para interpretar nPosition
das seguintes maneiras:
nFlags |
Interpretação de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
nFlags
Especifica como nPosition
é interpretado e fornece informações sobre as alterações a serem feitas no item de menu. Para obter uma lista de sinalizadores que podem ser definidos, consulte a função membro AppendMenu
.
nIDNewItem
Especifica a ID de comando do item de menu modificado ou, se nFlags
for definido como MF_POPUP
, o identificador de menu (HMENU
) de um menu de item pop-up. O parâmetro nIDNewItem
será ignorado (não necessário) se nFlags
for definido como MF_SEPARATOR
.
lpszNewItem
Especifica o conteúdo do novo item de menu. O parâmetro nFlags
pode ser usado para interpretar lpszNewItem
das seguintes maneiras:
nFlags |
Interpretação de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contém um valor de 32 bits fornecido pelo aplicativo que o aplicativo pode usar para manter dados adicionais associados ao item de menu. Esse valor de 32 bits está disponível para o aplicativo quando ele processa MF_MEASUREITEM e MF_DRAWITEM . |
MF_STRING |
Contém um ponteiro longo para uma cadeia de caracteres terminada em nulo ou para uma CString . |
MF_SEPARATOR |
O parâmetro lpszNewItem será ignorado (não necessário). |
pBmp
Aponta para um objeto CBitmap
que será usado como o item de menu.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
O aplicativo especifica o estado novo do item de menu definindo valores em nFlags
. Se essa função substituir um menu de item pop-up associado ao item de menu, ela destruirá o menu de item pop-up antigo e liberará a memória usada por ele.
Quando nIDNewItem
especifica um menu de item pop-up, ele se torna parte do menu no qual ele é inserido. Se esse menu for destruído, o menu inserido também será destruído. Um menu inserido deve ser desanexado de um objeto CMenu
para evitar conflitos.
Sempre que um menu que reside em uma janela é alterado (exibindo ou não a janela), o aplicativo deve chamar CWnd::DrawMenuBar
. Para alterar os atributos dos itens de menu existentes, é muito mais rápido usar as funções membro CheckMenuItem
e EnableMenuItem
.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::operator HMENU
Use esse operador para recuperar o identificador do objeto CMenu
.
operator HMENU() const;
Valor de retorno
Se tiver êxito, o identificador do objeto CMenu
; caso contrário, NULL
.
Comentários
Você pode usar o identificador para chamar as APIs do Windows diretamente.
CMenu::operator !=
Determina se dois menus são logicamente diferentes.
BOOL operator!=(const CMenu& menu) const;
Parâmetros
menu
Um objeto CMenu
para comparação.
Comentários
Testa se um objeto de menu à esquerda é diferente do objeto de menu à direita.
CMenu::operator ==
Determina se dois menus são logicamente iguais.
BOOL operator==(const CMenu& menu) const;
Parâmetros
menu
Um objeto CMenu
para comparação.
Comentários
Testa se um objeto de menu à esquerda é igual (em termos de valor HMENU
) a um objeto de menu à direita.
CMenu::RemoveMenu
Exclui um item de menu com um menu de item pop-up associado do menu.
BOOL RemoveMenu(
UINT nPosition,
UINT nFlags);
Parâmetros
nPosition
Especifica o item de menu que será removido. O parâmetro nFlags
pode ser usado para interpretar nPosition
das seguintes maneiras:
nFlags |
Interpretação de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
nFlags
Especifica como nPosition
é interpretado.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
Ele não destrói o identificador de um menu de item pop-up, portanto, o menu pode ser reutilizado. Antes de chamar essa função, o aplicativo pode chamar a função membro GetSubMenu
para recuperar o objeto de item pop-up CMenu
para reutilização.
Sempre que um menu que reside em uma janela é alterado (exibindo ou não a janela), o aplicativo pode chamar CWnd::DrawMenuBar
.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::SetDefaultItem
Define o item de menu padrão para o menu especificado.
BOOL SetDefaultItem(
UINT uItem,
BOOL fByPos = FALSE);
Parâmetros
uItem
Identificador ou posição do novo item de menu padrão ou - 1 para nenhum item padrão. O significado desse parâmetro depende do valor de fByPos
.
fByPos
Valor que especifica o significado de uItem
. Se esse parâmetro for FALSE
, uItem
será um identificador de item de menu. Caso contrário, é uma posição de item de menu.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será diferente de zero. Se a função falhar, o valor retornado será zero. Para obter informações de erro estendidas, use a função do Win32 GetLastError
, conforme descrito no SDK do Windows.
Comentários
Essa função membro implementa o comportamento da função do Win32 SetMenuDefaultItem
, conforme descrito no SDK do Windows.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::SetMenuContextHelpId
Associa uma ID de ajuda de contexto ao CMenu
.
BOOL SetMenuContextHelpId(DWORD dwContextHelpId);
Parâmetros
dwContextHelpId
ID de ajuda de contexto a ser associada ao CMenu
.
Valor de retorno
Diferente de zero se tiver êxito. Caso contrário, 0
Comentários
Todos os itens no menu compartilham esse identificador — não é possível anexar um identificador de contexto de ajuda aos itens de menu individuais.
Exemplo
Confira o exemplo de CMenu::InsertMenu
.
CMenu::SetMenuInfo
Define informações para um menu.
BOOL SetMenuInfo(LPCMENUINFO lpcmi);
Parâmetros
lpcmi
Um ponteiro para uma estrutura MENUINFO
que contém informações para o menu.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será diferente de zero. Caso contrário, o valor retornado será zero.
Comentários
Chamar essa função para definir informações específicas sobre o menu.
CMenu::SetMenuItemBitmaps
Associa os bitmaps especificados a um item de menu.
BOOL SetMenuItemBitmaps(
UINT nPosition,
UINT nFlags,
const CBitmap* pBmpUnchecked,
const CBitmap* pBmpChecked);
Parâmetros
nPosition
Especifica o item de menu que será alterado. O parâmetro nFlags
pode ser usado para interpretar nPosition
das seguintes maneiras:
nFlags |
Interpretação de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que o parâmetro fornece a ID de comando do item de menu existente. Esse é o padrão caso MF_BYCOMMAND nem MF_BYPOSITION seja definido. |
MF_BYPOSITION |
Especifica que o parâmetro fornece a posição do item de menu existente. O primeiro item está na posição 0. |
nFlags
Especifica como nPosition
é interpretado.
pBmpUnchecked
Especifica o bitmap a ser usado em itens de menu que não estão selecionados.
pBmpChecked
Especifica o bitmap a ser usado em itens de menu que estão selecionados.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0.
Comentários
Se o item de menu estiver selecionado ou desmarcado, o Windows exibirá o bitmap apropriado próximo ao item de menu.
Se for pBmpUnchecked
ou pBmpChecked
será NULL
, o Windows não exibirá nada ao próximo ao item de menu do atributo correspondente. Se os dois parâmetros forem NULL
, o Windows usará a marca de seleção padrão quando o item for selecionado e removerá a marca de seleção quando o item estiver desmarcado.
Quando o menu é destruído, esses bitmaps não são destruídos; o aplicativo deve destruí-los.
A função GetMenuCheckMarkDimensions
do Windows recupera as dimensões da marca de seleção padrão usada para itens de menu. O aplicativo usa esses valores para determinar o tamanho apropriado para os bitmaps fornecidos com essa função. Obtenha o tamanho, crie seus bitmaps e, em seguida, defina-os.
Exemplo
// The code fragment below is from CMainFrame::OnCreate and shows
// how to associate bitmaps with the "Bitmap" menu item.
// Whether the "Bitmap" menu item is checked or unchecked, Windows
// displays the appropriate bitmap next to the menu item. Both
// IDB_CHECKBITMAP and IDB_UNCHECKBITMAP bitmaps are loaded
// in OnCreate() and destroyed in the destructor of CMainFrame class.
// CMainFrame is a CFrameWnd-derived class.
// Load bitmaps from resource. Both m_CheckBitmap and m_UnCheckBitmap
// are member variables of CMainFrame class of type CBitmap.
ASSERT(m_CheckBitmap.LoadBitmap(IDB_CHECKBITMAP));
ASSERT(m_UnCheckBitmap.LoadBitmap(IDB_UNCHECKBITMAP));
// Associate bitmaps with the "Bitmap" menu item.
CMenu *mmenu = GetMenu();
CMenu *submenu = mmenu->GetSubMenu(4);
ASSERT(submenu->SetMenuItemBitmaps(ID_MENU_BITMAP, MF_BYCOMMAND,
&m_CheckBitmap, &m_UnCheckBitmap));
// This code fragment is taken from CMainFrame::~CMainFrame
// Destroy the bitmap objects if they are loaded successfully
// in OnCreate().
if (m_CheckBitmap.m_hObject)
m_CheckBitmap.DeleteObject();
if (m_UnCheckBitmap.m_hObject)
m_UnCheckBitmap.DeleteObject();
CMenu::SetMenuItemInfo
Altera informações sobre um item de menu.
BOOL SetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parâmetros
uItem
Confira a descrição de uItem
no SetMenuItemInfo
do SDK do Windows.
lpMenuItemInfo
Confira a descrição de lpmii
no SetMenuItemInfo
do SDK do Windows.
fByPos
Confira a descrição de fByPosition
no SetMenuItemInfo
do SDK do Windows.
Comentários
Essa função encapsula SetMenuItemInfo
, descrita no SDK do Windows.
CMenu::TrackPopupMenu
Exibe um menu pop-up flutuante no local especificado e rastreia a seleção de itens no menu de item pop-up.
BOOL TrackPopupMenu(
UINT nFlags,
int x,
int y,
CWnd* pWnd,
LPCRECT lpRect = 0);
Parâmetros
nFlags
Especifica sinalizadores de posição de tela e de posição do mouse. Confira TrackPopupMenu
para obter uma lista dos sinalizadores disponíveis.
x
Especifica a posição horizontal nas coordenadas da tela do menu de item pop-up. Dependendo do valor do parâmetro nFlags
, o menu pode ser alinhado à esquerda, alinhado à direita ou centralizado em relação a essa posição.
y
Especifica a posição vertical nas coordenadas de tela da parte superior do menu na tela.
pWnd
Identifica a janela à qual o menu de item pop-up pertence. Esse parâmetro não pode ser NULL
, mesmo se o sinalizador TPM_NONOTIFY
for especificado. Essa janela recebe todas as mensagens WM_COMMAND
do menu. No Windows versões 3.1 e posteriores, a janela não recebe mensagens WM_COMMAND
até que retorne TrackPopupMenu
. No Windows 3.0, a janela recebe mensagens WM_COMMAND
antes de retornar TrackPopupMenu
.
lpRect
Ignorado.
Valor de retorno
Esse método retorna o resultado da chamada TrackPopupMenu
no SDK do Windows.
Comentários
Um menu de item pop-up flutuante pode aparecer em qualquer lugar na tela.
Exemplo
// The code fragment shows how to get the File menu from the
// application window and displays it as a floating popup menu
// when the right mouse button is clicked in view.
// CMdiView is a CView-derived class.
void CMdiView::OnRButtonDown(UINT nFlags, CPoint point)
{
CView::OnRButtonDown(nFlags, point);
CMenu *menu_bar = AfxGetMainWnd()->GetMenu();
CMenu *file_menu = menu_bar->GetSubMenu(0);
ASSERT(file_menu);
ClientToScreen(&point);
file_menu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,
point.y, this);
}
CMenu::TrackPopupMenuEx
Exibe um menu pop-up flutuante no local especificado e rastreia a seleção de itens no menu de item pop-up.
BOOL TrackPopupMenuEx(
UINT fuFlags,
int x,
int y,
CWnd* pWnd,
LPTPMPARAMS lptpm);
Parâmetros
fuFlags
Especifica várias funções para o menu estendido. Para obter uma listagem de todos os valores e seus significados, consulte TrackPopupMenuEx
.
x
Especifica a posição horizontal nas coordenadas da tela do menu de item pop-up.
y
Especifica a posição vertical nas coordenadas de tela da parte superior do menu na tela.
pWnd
Um ponteiro para a janela que possui o menu de item pop-up e recebe as mensagens do menu criado. Essa janela pode ser uma janela do aplicativo atual, mas não pode ser NULL
. Se você especificar TPM_NONOTIFY
no parâmetro fuFlags
, a função não enviará nenhuma mensagem para pWnd
. A função deve retornar para a janela apontada por pWnd
para receber a mensagem WM_COMMAND
.
lptpm
Ponteiro para uma estrutura TPMPARAMS
que especifica uma área da tela que o menu não deve sobrepor. Esse parâmetro pode ser NULL
.
Valor de retorno
Se você especificar TPM_RETURNCMD
no parâmetro fuFlags
, o valor retornado será o identificador de item de menu do item selecionado pelo usuário. Se o usuário cancelar o menu sem fazer uma seleção ou se ocorrer um erro, o valor retornado será 0.
Se você não especificar TPM_RETURNCMD
no parâmetro fuFlags
, o valor retornado será diferente de zero se a função for bem-sucedida e 0 se falhar. Para obter outras informações sobre o erro, chame GetLastError
.
Comentários
Um menu de item pop-up flutuante pode aparecer em qualquer lugar na tela. Para obter mais informações sobre como lidar com erros ao criar o menu de item pop-up, consulte TrackPopupMenuEx
.
Confira também
Exemplo de MFC CTRLTEST
Exemplo de MFC DYNAMENU
Classe CObject
Gráfico da hierarquia