Clase CMenu
Una encapsulación de HMENU
de Windows.
Sintaxis
class CMenu : public CObject
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CMenu::CMenu |
Construye un objeto CMenu . |
Métodos públicos
Nombre | Descripción |
---|---|
CMenu::AppendMenu |
Anexa un nuevo elemento al final de este menú. |
CMenu::Attach |
Adjunta un manipulador de Windows a un objeto CMenu . |
CMenu::CheckMenuItem |
Coloca una marca de verificación al lado a o quita una marca de verificación de un elemento de menú en el menú emergente. |
CMenu::CheckMenuRadioItem |
Coloca un botón de radio junto a un elemento de menú y quita el botón de radio de todos los demás elementos de menú en el grupo. |
CMenu::CreateMenu |
Crea un menú vacío y lo adjunta a un objeto CMenu . |
CMenu::CreatePopupMenu |
Crea un menú emergente vacío y lo adjunta a un objeto CMenu . |
CMenu::DeleteMenu |
Elimina un elemento especificado del menú. Si el elemento de menú tiene un menú emergente asociado, destruye el manipulador en el menú emergente y libera la memoria usada por él. |
CMenu::DeleteTempMap |
Elimina los objetos temporales CMenu creados por la función miembro FromHandle . |
CMenu::DestroyMenu |
Destruye el menú adjunto a un objeto CMenu y libera cualquier memoria que ocupe el menú. |
CMenu::Detach |
Desasocia un manipulador de Windows de un objeto CMenu y devuelve el manipulador. |
CMenu::DrawItem |
La llama el marco cuando cambia un aspecto visual de un menú dibujado por el propietario. |
CMenu::EnableMenuItem |
Habilita, deshabilita o atenúa (en color gris) un elemento de menú. |
CMenu::FromHandle |
Devuelve un puntero a un objeto CMenu cuando se proporciona un manipulador de Windows. |
CMenu::GetDefaultItem |
Determina el elemento de menú predeterminado en el menú especificado. |
CMenu::GetMenuContextHelpId |
Recupera el id. de contexto de ayuda asociado al menú. |
CMenu::GetMenuInfo |
Recupera información en un menú específico. |
CMenu::GetMenuItemCount |
Determina el número de elementos de un menú emergente o de nivel superior. |
CMenu::GetMenuItemID |
Obtiene el identificador de elemento de menú ubicado en la posición especificada. |
CMenu::GetMenuItemInfo |
Recupera información sobre un elemento de menú. |
CMenu::GetMenuState |
Devuelve el estado del elemento de menú especificado o el número de elementos de un menú emergente. |
CMenu::GetMenuString |
Recupera la etiqueta del elemento de menú especificado. |
CMenu::GetSafeHmenu |
Devuelve el m_hMenu contenido por este objeto CMenu . |
CMenu::GetSubMenu |
Recupera un puntero a un menú emergente. |
CMenu::InsertMenu |
Inserta un nuevo elemento de menú en la posición especificada, al mover otros elementos hacia abajo del menú. |
CMenu::InsertMenuItem |
Inserta un nuevo elemento de menú en la posición especificada de un menú. |
CMenu::LoadMenu |
Carga un recurso de menú desde el archivo ejecutable y lo adjunta a un objeto CMenu . |
CMenu::LoadMenuIndirect |
Carga un menú de una plantilla de menú en memoria y lo adjunta a un objeto CMenu . |
CMenu::MeasureItem |
La llama el marco para determinar las dimensiones de menú cuando se crea un menú dibujado por el propietario. |
CMenu::ModifyMenu |
Cambia un elemento de menú existente en la posición especificada. |
CMenu::RemoveMenu |
Elimina un elemento de menú con un menú emergente asociado del menú especificado. |
CMenu::SetDefaultItem |
Establece el elemento de menú predeterminado para el menú especificado. |
CMenu::SetMenuContextHelpId |
Recupera el id. de contexto de ayuda asociado con el menú. |
CMenu::SetMenuInfo |
Recupera información en un menú específico. |
CMenu::SetMenuItemBitmaps |
Asocia los mapas de bits de marca de verificación especificados con un elemento de menú. |
CMenu::SetMenuItemInfo |
Cambia información sobre un elemento de menú. |
CMenu::TrackPopupMenu |
Muestra un menú emergente flotante en la ubicación especificada y supervisa la selección de elementos en el menú emergente. |
CMenu::TrackPopupMenuEx |
Muestra un menú emergente flotante en la ubicación especificada y supervisa la selección de elementos en el menú emergente. |
Operadores públicos
Nombre | Descripción |
---|---|
CMenu::operator HMENU |
Recupera el manipulador del objeto de menú. |
CMenu::operator != |
Determina si dos objetos de menú no son iguales. |
CMenu::operator == |
Determina si dos objetos de menú son iguales. |
Miembros de datos públicos
Nombre | Descripción |
---|---|
CMenu::m_hMenu |
Especifica el manipulador del menú de Windows adjunto al objeto CMenu . |
Comentarios
Proporciona funciones miembro para crear, supervisar, actualizar y destruir un menú.
Cree un objeto CMenu
en el marco de pila como local y, a continuación, llame a las funciones miembro de CMenu
para manipular el nuevo menú según sea necesario. A continuación, llame CWnd::SetMenu
a para establecer el menú en una ventana, seguido inmediatamente de una llamada a la función miembro Detach
del objeto CMenu
. La función miembro CWnd::SetMenu
establece el menú de la ventana en el nuevo menú, ocasiona que la ventana se vuelva a dibujar para reflejar el cambio de menú y también pasa la propiedad del menú a la ventana. La llamada a Detach
desasocia el HMENU
del objeto CMenu
para que cuando la variable local CMenu
pase fuera del ámbito, el destructor de objeto CMenu
no intente destruir un menú que ya no posee. El propio menú se destruye automáticamente cuando se destruye la ventana.
Puede usar la función miembro LoadMenuIndirect
para crear un menú a partir de una plantilla en la memoria, pero un menú creado a partir de un recurso mediante una llamada a LoadMenu
se mantiene más fácilmente y el propio recurso de menú se puede crear y modificar mediante el editor de menús.
Jerarquía de herencia
CMenu
Requisitos
Encabezado: afxwin.h
CMenu::AppendMenu
Anexa un nuevo elemento al final de este menú.
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 información sobre el estado del elemento de menú nuevo cuando se agrega al menú. Consta de uno o más de los valores enumerados en la sección Comentarios.
nIDNewItem
Especifica el id. de comando del nuevo elemento de menú o, si nFlags
está establecido en MF_POPUP
, el manipulador de menú (HMENU
) de un menú emergente. El parámetro nIDNewItem
se omite (no es necesario) si nFlags
se establece en MF_SEPARATOR
.
lpszNewItem
Especifica el contenido del nuevo elemento de menú. El parámetro nFlags
se usa para interpretar lpszNewItem
de la siguiente manera:
nFlags |
Interpretación de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contiene un valor de 32 bits proporcionado por la aplicación que la aplicación puede usar para mantener datos adicionales asociados al elemento de menú. Este valor de 32 bits está disponible para la aplicación cuando procesa mensajes de WM_MEASUREITEM y WM_DRAWITEM . El valor se almacena en el miembro itemData de la estructura proporcionada con esos mensajes. |
MF_STRING |
Puntero a una cadena terminada en null. Esta es la interpretación predeterminada. |
MF_SEPARATOR |
El parámetro lpszNewItem se omite (no es necesario). |
pBmp
Apunta a un objeto CBitmap
que se usará como elemento de menú.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
La aplicación puede especificar el estado del elemento de menú al establecer valores en nFlags
. Cuando nIDNewItem
especifica un menú emergente, se convierte en parte del menú al que se anexa. Si ese menú se destruye, también se destruirá el menú anexado. Se debe desasociar un menú anexado de un objeto CMenu
para evitar conflictos. Tenga en cuenta que MF_STRING
y MF_OWNERDRAW
no son válidos para la versión de mapa de bits de AppendMenu
.
La lista siguiente describe las marcas que se pueden establecer en nFlags
:
MF_CHECKED
Actúa como un botón de alternancia conMF_UNCHECKED
para colocar la marca de verificación predeterminada junto al elemento. Cuando la aplicación proporciona mapas de bits de marca de verificación (consulte la función miembroSetMenuItemBitmaps
), se muestra el mapa de bits "marca de verificación".MF_UNCHECKED
Actúa como un botón de alternancia conMF_CHECKED
para quitar una marca de verificación junto al elemento. Cuando la aplicación proporciona mapas de bits de marca de verificación (consulte la función miembroSetMenuItemBitmaps
), se muestra el mapa de bits "marca de verificación".MF_DISABLED
Deshabilita el elemento de menú para que no se pueda seleccionar, pero no lo atenúa.MF_ENABLED
Habilita el elemento de menú para que se pueda seleccionar y restaurar a partir de su estado atenuado.MF_GRAYED
Deshabilita el elemento de menú para que no se pueda seleccionar y lo atenúa.MF_MENUBARBREAK
Coloca el elemento en una nueva línea en menús estáticos o en una nueva columna en menús emergentes. La nueva columna de menú emergente se separará de la columna anterior mediante una línea divisoria vertical.MF_MENUBREAK
Coloca el elemento en una nueva línea en menús estáticos o en una nueva columna en menús emergentes. No se coloca ninguna línea divisoria entre las columnas.MF_OWNERDRAW
Especifica que el elemento es un elemento dibujado por el propietario. Cuando el menú se muestra por primera vez, la ventana propietaria del menú recibe un mensaje deWM_MEASUREITEM
, que recupera la altura y la anchura del elemento de menú. El mensaje deWM_DRAWITEM
es el que se envía cada vez que el propietario debe actualizar la apariencia visual del elemento de menú. Esta opción no es válida para un elemento de menú de nivel superior.MF_POPUP
Especifica que el elemento de menú tiene asociado un menú emergente. El id. de parámetro especifica un manipulador para un menú emergente que se va a asociar al elemento. Se usa para agregar un menú emergente de nivel superior o un menú emergente jerárquico con un elemento de menú emergente.MF_SEPARATOR
Dibuja una línea divisoria horizontal. Solo se puede usar en un menú emergente. Esta línea no se puede atenuar, deshabilitar ni resaltar. Otros parámetros se ignoran.MF_STRING
Especifica que el elemento de menú es una cadena de caracteres.
Cada uno de los grupos siguientes enumera las marcas que son mutuamente excluyentes y no se pueden usar juntas:
MF_DISABLED
,MF_ENABLED
yMF_GRAYED
MF_STRING
,MF_OWNERDRAW
,MF_SEPARATOR
y la versión del mapa de bitsMF_MENUBARBREAK
yMF_MENUBREAK
MF_CHECKED
yMF_UNCHECKED
Cada vez que se cambia un menú que reside en una ventana (ya sea que se muestre o no la ventana), la aplicación debe llamar a CWnd::DrawMenuBar
.
Ejemplo
Vea el ejemplo de CMenu::CreateMenu
.
CMenu::Attach
Asocia un menú de Windows existente a un objeto CMenu
.
BOOL Attach(HMENU hMenu);
Parámetros
hMenu
Especifica un manipulador para una ventana de Windows.
Valor devuelto
Distinto de cero si la operación es correcta; de lo contrario, 0.
Comentarios
No se debe llamar a esta función si ya hay un menú adjunto al objeto CMenu
. El manipulador de menú se almacena en el miembro de datos m_hMenu
.
Si el menú que desea manipular ya está asociado a una ventana, puede usar la función CWnd::GetMenu
para obtener un manipulador en el menú.
Ejemplo
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
Agrega o quita marcas de verificación de los elementos de menú del menú emergente.
UINT CheckMenuItem(
UINT nIDCheckItem,
UINT nCheck);
Parámetros
nIDCheckItem
Especifica el elemento de menú que se comprobará, según lo determinado por nCheck
.
nCheck
Especifica cómo comprobar el elemento de menú y cómo determinar la posición del elemento en el menú. El parámetro nCheck
puede ser una combinación de MF_CHECKED
o MF_UNCHECKED
con marcas MF_BYPOSITION
o MF_BYCOMMAND
. Estos marcadores se pueden combinar utilizando el operador OR bit a bit. Tienen los significados siguientes:
MF_BYCOMMAND
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado.MF_BYPOSITION
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0.MF_CHECKED
Actúa como un botón de alternancia conMF_UNCHECKED
para colocar la marca de verificación predeterminada junto al elemento.MF_UNCHECKED
Actúa como un botón de alternancia conMF_CHECKED
para quitar una marca de verificación junto al elemento.
Valor devuelto
El estado anterior del elemento: MF_CHECKED
o MF_UNCHECKED
, o 0xFFFFFFFF
si el elemento de menú no existía.
Comentarios
El parámetro nIDCheckItem
especifica el elemento que se va a modificar.
El parámetro nIDCheckItem
puede identificar un elemento de menú emergente, así como un elemento de menú. No es necesario realizar ningún paso especial para comprobar un elemento de menú emergente. No se pueden comprobar los elementos de menú de nivel superior. Un elemento de menú emergente debe comprobarse por posición, ya que no tiene un identificador de elemento de menú asociado.
Ejemplo
Vea el ejemplo de CMenu::GetMenuState
.
CMenu::CheckMenuRadioItem
Comprueba un elemento de menú especificado y lo convierte en un elemento de radio.
BOOL CheckMenuRadioItem(
UINT nIDFirst,
UINT nIDLast,
UINT nIDItem,
UINT nFlags);
Parámetros
nIDFirst
Especifica (como un id. o un desplazamiento, según el valor de nFlags
) el primer elemento de menú del grupo de botones de radio.
nIDLast
Especifica (como un id. o un desplazamiento, según el valor de nFlags
) el último elemento de menú del grupo de botones de radio.
nIDItem
Especifica (como id. o desplazamiento, según el valor de nFlags
) el elemento del grupo que se comprobará con un botón de radio.
nFlags
Especifica la interpretación de nIDFirst
, nIDLast
y nIDItem
de la siguiente manera:
nFlags | Interpretación |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
Valor devuelto
Si es correcto, su valor es distinto de cero. En caso contrario, es 0
Comentarios
Al mismo tiempo, la función desmarca todos los demás elementos de menú del grupo asociado y borra la marca de tipo de elemento de radio para esos elementos. El elemento activado se muestra mediante un mapa de bits de botón de radio (o viñeta) en lugar de un mapa de bits de marca de verificación.
Ejemplo
Vea el ejemplo de ON_COMMAND_RANGE
.
CMenu::CMenu
Crea un menú vacío y lo adjunta a un objeto CMenu
.
CMenu();
Comentarios
El menú no se crea hasta que se llama a una de las funciones miembro de creación o carga de CMenu
:
CMenu::CreateMenu
Crea un menú y lo adjunta al objeto CMenu
.
BOOL CreateMenu();
Valor devuelto
Distinto de cero si el menú se creó correctamente; en caso contrario, 0.
Comentarios
El menú está inicialmente vacío. Los elementos de menú se pueden agregar mediante la función miembro AppendMenu
o InsertMenu
.
Si el menú se asigna a una ventana, se destruye automáticamente cuando se destruye la ventana.
Antes de salir, una aplicación debe liberar recursos del sistema asociados con un menú si el menú no está asignado a una ventana. Una aplicación libera un menú al llamar a la función miembro DestroyMenu
.
Ejemplo
// 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
Crea un menú emergente y lo adjunta al objeto CMenu
.
BOOL CreatePopupMenu();
Valor devuelto
Distinto de cero si el menú emergente se creó correctamente; de lo contrario, 0.
Comentarios
El menú está inicialmente vacío. Los elementos de menú se pueden agregar mediante la función miembro AppendMenu
o InsertMenu
. La aplicación puede agregar el menú emergente a un menú existente o a un menú emergente. La función miembro TrackPopupMenu
se puede usar para mostrar este menú como un menú emergente flotante y para seguir las selecciones en el menú emergente.
Si el menú se asigna a una ventana, se destruye automáticamente cuando se destruye la ventana. Si el menú se agrega a un menú existente, se destruye automáticamente cuando se destruye ese menú.
Antes de salir, una aplicación debe liberar recursos del sistema asociados con un menú emergente si el menú no está asignado a una ventana. Una aplicación libera un menú al llamar a la función miembro DestroyMenu
.
Ejemplo
Vea el ejemplo de CMenu::CreateMenu
.
CMenu::DeleteMenu
Elimina un elemento del menú.
BOOL DeleteMenu(
UINT nPosition,
UINT nFlags);
Parámetros
nPosition
Especifica el elemento de menú que se va a eliminar, según se determina mediante nFlags
.
nFlags
Se usa para interpretar nPosition
de la siguiente manera:
nFlags |
Interpretación de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
Si el elemento de menú tiene un menú emergente asociado, DeleteMenu
destruye el manipulador para el menú emergente y libera la memoria usada por el menú emergente.
Cada vez que se cambia un menú que reside en una ventana (ya sea que se muestre o no la ventana), la aplicación debe llamar a CWnd::DrawMenuBar
.
Ejemplo
Vea el ejemplo de CWnd::GetMenu
.
CMenu::DeleteTempMap
El controlador de tiempo de inactividad CWinApp
la llama automáticamente y elimina cualquier objeto temporal CMenu
creado por la función miembro FromHandle
.
static void PASCAL DeleteTempMap();
Comentarios
DeleteTempMap
desasocia el objeto de menú de Windows que estaba asociado con un objeto CMenu
temporal antes de que se elimine el objeto CMenu
.
Ejemplo
// DeleteTempMap() is a static member and does not need
// an instantiated CMenu object.
CMenu::DeleteTempMap();
CMenu::DestroyMenu
Destruye el menú y los recursos de Windows que se usaron.
BOOL DestroyMenu();
Valor devuelto
Distinto de cero si se destruye el menú; de lo contrario, 0.
Comentarios
El menú se desasocia del objeto CMenu
antes de que se destruya. Se llama automáticamente a la función de Windows DestroyMenu
en el destructor CMenu
.
Ejemplo
Vea el ejemplo de CMenu::CreateMenu
.
CMenu::Detach
Desasocia un menú de Windows de un objeto CMenu
y devuelve el manipulador.
HMENU Detach();
Valor devuelto
El manipulador, de tipo HMENU
, en un menú de Windows, si se ejecuta correctamente; de lo contrario NULL
.
Comentarios
El miembro de datos m_hMenu
se establece en NULL
.
Ejemplo
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
La llama el marco cuando cambia un aspecto visual de un menú dibujado por el propietario.
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
Parámetros
lpDrawItemStruct
Un puntero a una estructura DRAWITEMSTRUCT
que contiene información sobre el tipo de dibujo necesario.
Comentarios
El miembro itemAction
de la estructura DRAWITEMSTRUCT
define la acción de dibujo que se realizará. Invalida esta función miembro para implementar el dibujo de un objeto CMenu
dibujado por el propietario. La aplicación debe restaurar todos los objetos de la interfaz de dispositivo gráfico (GDI) seleccionados para el contexto de visualización que se proporciona en lpDrawItemStruct
antes de que finalice esta función miembro.
Consulte CWnd::OnDrawItem
para obtener una descripción de la estructura DRAWITEMSTRUCT
.
Ejemplo
El código siguiente procede de la muestra de CTRLTEST
de 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, deshabilita o atenúa un elemento de menú.
UINT EnableMenuItem(
UINT nIDEnableItem,
UINT nEnable);
Parámetros
nIDEnableItem
Especifica el elemento de menú que se habilitará, según lo determinado por nEnable
. Este parámetro puede especificar elementos de menú emergente, así como elementos de menú estándar.
nEnable
Especifica la acción que se va a realizar. Puede ser una combinación de MF_DISABLED
, MF_ENABLED
o MF_GRAYED
, con MF_BYCOMMAND
o MF_BYPOSITION
. Estos valores se pueden combinar mediante el operador OR bit a bit (|
). Estos valores tienen los significados siguientes:
MF_BYCOMMAND
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado.MF_BYPOSITION
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0.MF_DISABLED
Deshabilita el elemento de menú para que no se pueda seleccionar, pero no lo atenúa.MF_ENABLED
Habilita el elemento de menú para que se pueda seleccionar y restaurar a partir de su estado atenuado.MF_GRAYED
Deshabilita el elemento de menú para que no se pueda seleccionar y lo atenúa.
Valor devuelto
Estado anterior (MF_DISABLED
, MF_ENABLED
o MF_GRAYED
), o -1 si no es válido.
Comentarios
Las funciones miembro CreateMenu
, InsertMenu
, ModifyMenu
y LoadMenuIndirect
también pueden establecer el estado (habilitado, deshabilitado o atenuado) de un elemento de menú.
El uso del valor MF_BYPOSITION
requiere que una aplicación use el CMenu
correcto. Si se usa el elemento CMenu
de la barra de menús, se ve afectado un elemento de menú de nivel superior (un elemento de la barra de menús). Para establecer el estado de un elemento en un menú emergente o en un menú emergente anidado por posición, una aplicación debe especificar el CMenu
del menú emergente.
Cuando una aplicación especifica la marca MF_BYCOMMAND
, Windows comprueba todos los elementos de menú emergente que están subordinados a CMenu
; por lo tanto, a menos que haya elementos de menú duplicados, el uso del CMenu
de la barra de menús es suficiente.
Ejemplo
// 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
Devuelve un puntero que apunta a un objeto CMenu
si se proporciona el manipulador de Windows para un menú.
static CMenu* PASCAL FromHandle(HMENU hMenu);
Parámetros
hMenu
Un manipulador de Windows para un menú.
Valor devuelto
Un puntero a CMenu
que podría ser temporal o permanente.
Comentarios
Si todavía no se ha asociado un objeto CMenu
con el objeto del menú de Windows, se creará y asociará un objeto CMenu
temporal.
Este objeto CMenu
temporal solo es válido hasta la próxima vez que haya tiempo de inactividad en el bucle de eventos de la aplicación. En ese momento, se eliminarán todos los objetos temporales.
Ejemplo
Vea el ejemplo de CMenu::CreateMenu
.
CMenu::GetDefaultItem
Determina el elemento de menú predeterminado en el menú especificado.
UINT GetDefaultItem(
UINT gmdiFlags,
BOOL fByPos = FALSE);
Parámetros
gmdiFlags
Valor que especifica cómo busca la función elementos de menú. Este parámetro puede ser ninguno, uno o una combinación de los siguientes valores:
Valor | Significado |
---|---|
GMDI_GOINTOPOPUPS |
Especifica que, si el elemento predeterminado es uno que abre un submenú, la función es buscar en el submenú correspondiente de forma recursiva. Si el submenú no tiene ningún elemento predeterminado, el valor devuelto identifica el elemento que abre el submenú. De forma predeterminada, la función devuelve el primer elemento predeterminado del menú especificado, independientemente de si es un elemento que abre un submenú. |
GMDI_USEDISABLED |
Especifica que la función es devolver un elemento predeterminado, incluso si está deshabilitado. De forma predeterminada, la función omite los elementos deshabilitados o atenuados. |
fByPos
Valor que especifica si se va a recuperar el identificador del elemento de menú o su posición. Si este parámetro es FALSE
, se devuelve el identificador . De lo contrario, se devuelve la posición.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es el identificador o la posición del elemento de menú. Si la función produce un error, el valor devuelto es - 1.
Comentarios
En esta función miembro, se implementa el comportamiento de la función GetMenuDefaultItem
de Win32, tal y como se describe en Windows SDK.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::GetMenuContextHelpId
Recupera el id. de ayuda de contexto asociado con CMenu
.
DWORD GetMenuContextHelpId() const;
Valor devuelto
El id. de ayuda de contexto asociado actualmente con CMenu
si tiene uno; de lo contrario, cero.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::GetMenuInfo
Recupera información de un menú.
BOOL GetMenuInfo(LPMENUINFO lpcmi) const;
Parámetros
lpcmi
Un puntero a una estructura MENUINFO
que contiene información para el menú.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es distinto de cero; de lo contrario, el valor devuelto es cero.
Comentarios
Llame a esta función para recuperar información sobre el menú.
CMenu::GetMenuItemCount
Determina el número de elementos de un menú emergente o de nivel superior.
UINT GetMenuItemCount() const;
Valor devuelto
El número de elementos del menú si la función es correcta; en caso contrario, -1.
Ejemplo
Vea el ejemplo de CWnd::GetMenu
.
CMenu::GetMenuItemID
Obtiene el identificador del elemento de menú ubicado en la posición especificada por nPos
.
UINT GetMenuItemID(int nPos) const;
Parámetros
nPos
Especifica la posición (basada en cero) del elemento de menú cuyo id. se está recuperando.
Valor devuelto
Id. del elemento especificado en un menú emergente si la función se ejecuta correctamente. Si el elemento especificado es un menú emergente (en lugar de un elemento dentro del menú emergente), el valor devuelto es -1. Si nPos
corresponde a un elemento de menú SEPARATOR
, el valor devuelto es 0.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::GetMenuItemInfo
Recupera información sobre un elemento de menú.
BOOL GetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parámetros
uItem
Identificador o posición del elemento de menú sobre el que obtendrá información. El significado de este parámetro depende del valor de ByPos
.
lpMenuItemInfo
Un puntero a MENUITEMINFO
, como se describe en Windows SDK, que contiene información sobre el menú.
fByPos
Valor que especifica el significado de nIDItem
. De forma predeterminada, ByPos
es FALSE
, lo cual indica que uItem es un identificador de elemento de menú. Si ByPos
no se establece en FALSE
, indica una posición de elemento de menú.
Valor devuelto
Si la función se realiza correctamente, el valor devuelto es distinto de cero. Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de un error extendida, use la función GetLastError
de Win32, como se describe en Windows SDK.
Comentarios
Esta función miembro se implementa el comportamiento de la función GetMenuItemInfo
de Win32, tal y como se describe en Windows SDK. Tenga en cuenta que en la implementación de MFC de GetMenuItemInfo
, no se usa un manipulador para un menú.
Ejemplo
// 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
Devuelve el estado del elemento de menú especificado o el número de elementos de un menú emergente.
UINT GetMenuState(
UINT nID,
UINT nFlags) const;
Parámetros
nID
Especifica el id. del elemento de menú, determinado por nFlags
.
nFlags
Especifica la naturaleza de nID
. Puede ser uno de los siguientes valores:
MF_BYCOMMAND
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado.MF_BYPOSITION
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0.
Valor devuelto
El valor 0xFFFFFFFF
si el elemento especificado no existe. Si nId
identifica un menú emergente, el byte de orden superior contiene el número de elementos del menú emergente y el byte de orden inferior contiene las marcas de menú asociadas con el menú emergente. De lo contrario, el valor devuelto es una máscara (OR booleano) de los valores de la lista siguiente (esta máscara describe el estado del elemento de menú que nId
identifica):
MF_CHECKED
Actúa como un botón de alternancia conMF_UNCHECKED
para colocar la marca de verificación predeterminada junto al elemento. Cuando la aplicación proporciona mapas de bits de marca de verificación (consulte la función miembroSetMenuItemBitmaps
), se muestra el mapa de bits "marca de verificación".MF_DISABLED
Deshabilita el elemento de menú para que no se pueda seleccionar, pero no lo atenúa.MF_ENABLED
Habilita el elemento de menú para que se pueda seleccionar y restaurar a partir de su estado atenuado. Tenga en cuenta que el valor de esta constante es 0; una aplicación no debe arrojar 0 en una prueba al usar este valor.MF_GRAYED
Deshabilita el elemento de menú para que no se pueda seleccionar y lo atenúa.MF_MENUBARBREAK
Coloca el elemento en una nueva línea en menús estáticos o en una nueva columna en menús emergentes. La nueva columna de menú emergente se separará de la columna anterior mediante una línea divisoria vertical.MF_MENUBREAK
Coloca el elemento en una nueva línea en menús estáticos o en una nueva columna en menús emergentes. No se coloca ninguna línea divisoria entre las columnas.MF_SEPARATOR
Dibuja una línea divisoria horizontal. Solo se puede usar en un menú emergente. Esta línea no se puede atenuar, deshabilitar ni resaltar. Otros parámetros se ignoran.MF_UNCHECKED
Actúa como un botón de alternancia conMF_CHECKED
para quitar una marca de verificación junto al elemento. Cuando la aplicación proporciona mapas de bits de marca de verificación (consulte la función miembroSetMenuItemBitmaps
), se muestra el mapa de bits "marca de verificación". Tenga en cuenta que el valor de esta constante es 0; una aplicación no debe arrojar 0 en una prueba al usar este valor.
Ejemplo
// 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 la etiqueta del elemento de menú especificado en el búfer 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 el identificador entero del elemento de menú o el desplazamiento del elemento de menú en el menú, en función del valor de nFlags
.
lpString
Apunta a un búfer que recibirá la etiqueta.
rString
Una referencia a un objeto CString
que recibirá la cadena de menú copiada.
nMaxCount
Especifica la longitud máxima (en caracteres) de la etiqueta que se copiará. Si la etiqueta es mayor que el máximo especificado en nMaxCount
, se truncan los caracteres adicionales.
nFlags
Especifica la interpretación del parámetro nIDItem
. Puede ser uno de los siguientes valores:
nFlags |
Interpretación de nIDItem |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
Valor devuelto
Especifica el número real de caracteres copiados en el búfer, sin incluir el terminador null.
Comentarios
El parámetro nMaxCount
debe ser uno mayor que el número de caracteres en la etiqueta para dar cabida al carácter null que finaliza una cadena.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::GetSafeHmenu
Devuelve el HMENU
contenedor de este CMenu
objeto o un NULL
CMenu
puntero.
HMENU GetSafeHmenu() const;
Ejemplo
Vea el ejemplo de CMenu::LoadMenu
.
CMenu::GetSubMenu
Recupera el objeto CMenu
de un menú emergente.
CMenu* GetSubMenu(int nPos) const;
Parámetros
nPos
Especifica la posición del menú emergente contenido en el menú. Los valores de posición comienzan en 0 para el primer elemento de menú. El identificador del menú emergente no se puede usar en esta función.
Valor devuelto
Un puntero a un objeto CMenu
cuyo miembro m_hMenu
contiene un manipulador para el menú emergente si existe un menú emergente en la posición especificada; de lo contrario NULL
. Si no existe un objeto CMenu
, se crea entonces uno temporal. El puntero CMenu
devuelto no debe almacenarse.
Ejemplo
Vea el ejemplo de CMenu::TrackPopupMenu
.
CMenu::InsertMenu
Inserta un nuevo elemento de menú en la posición especificada por nPosition
y mueve otros elementos hacia abajo en el menú.
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 el elemento de menú antes del cual se va a insertar el nuevo elemento de menú. El parámetro nFlags
se usa para interpretar nPosition
de la siguiente manera:
nFlags |
Interpretación de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. Si nPosition es -1, el nuevo elemento de menú se anexa al final del menú. |
nFlags
Especifica cómo se interpreta nPosition
y especifica información sobre el estado del elemento de menú nuevo cuando se agrega al menú. Para obtener una lista de las marcas que se pueden establecer, consulte la función miembro AppendMenu
. Para especificar más de un valor, use el operador OR bit a bit para combinarlos con la marca MF_BYCOMMAND
o MF_BYPOSITION
.
nIDNewItem
Especifica el id. de comando del nuevo elemento de menú o, si nFlags
está establecido en MF_POPUP
, el manipulador de menú (HMENU
) del menú emergente. El parámetro nIDNewItem
se omite (no es necesario) si nFlags
se establece en MF_SEPARATOR
.
lpszNewItem
Especifica el contenido del nuevo elemento de menú. nFlags
se puede usar para interpretar lpszNewItem
de las siguientes maneras:
nFlags |
Interpretación de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contiene un valor de 32 bits proporcionado por la aplicación que la aplicación puede usar para mantener datos adicionales asociados al elemento de menú. Este valor de 32 bits está disponible para la aplicación en el miembro itemData de la estructura proporcionada por los mensajes de WM_MEASUREITEM y WM_DRAWITEM . Estos mensajes se envían cuando se cambia o se muestra inicialmente el elemento de menú. |
MF_STRING |
Contiene un puntero largo a una cadena finalizada en null. Esta es la interpretación predeterminada. |
MF_SEPARATOR |
El parámetro lpszNewItem se omite (no es necesario). |
pBmp
Apunta a un objeto CBitmap
que se usará como elemento de menú.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
La aplicación puede especificar el estado del elemento de menú al establecer valores en nFlags
.
Cada vez que se cambia un menú que reside en una ventana (ya sea que se muestre o no la ventana), la aplicación debe llamar a CWnd::DrawMenuBar
.
Cuando nIDNewItem
especifica un menú emergente, se convierte en parte del menú al que se inserta. Si ese menú se destruye, también se destruirá el menú insertado. Se debe desasociar un menú insertado de un objeto CMenu
para evitar conflictos.
Si se maximiza la ventana secundaria de la interfaz de varios documentos (MDI) activa y una aplicación inserta un menú emergente en el menú de la aplicación de MDI al llamar a esta función y especificar la marca MF_BYPOSITION
, el menú se inserta una posición más lejos de lo esperado. Esto sucede porque el menú Control de la ventana secundaria de la MDI activa se inserta en la primera posición de la barra de menús de la ventana del marco de MDI. Para colocar el menú correctamente, la aplicación debe agregar 1 al valor de posición que, de lo contrario, se usaría. Una aplicación puede usar el mensaje WM_MDIGETACTIVE
para determinar si la ventana secundaria actualmente activa está maximizada.
Ejemplo
// 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
Inserta un nuevo elemento de menú en la posición especificada de un menú.
BOOL InsertMenuItem(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parámetros
uItem
Consulte la descripción de uItem
en InsertMenuItem
en Windows SDK.
lpMenuItemInfo
Consulte la descripción de lpmii
en InsertMenuItem
en Windows SDK.
fByPos
Consulte la descripción de fByPosition
en InsertMenuItem
en Windows SDK.
Comentarios
Esta función encapsula InsertMenuItem
, que se describe en Windows SDK.
CMenu::LoadMenu
Carga un recurso de menú desde el archivo ejecutable de la aplicación y lo adjunta al objeto CMenu
.
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);
Parámetros
lpszResourceName
Apunta a una cadena finalizada en null que contiene el nombre del recurso de menú que se cargará.
nIDResource
Especifica el id. de menú del recurso de menú que se cargará.
Valor devuelto
Distinto de cero si el recurso de menú se cargó correctamente; de lo contrario, 0.
Comentarios
Antes de salir, una aplicación debe liberar recursos del sistema asociados con un menú si el menú no está asignado a una ventana. Una aplicación libera un menú al llamar a la función miembro DestroyMenu
.
Ejemplo
// 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
Carga un menú de una plantilla de menú en memoria y lo adjunta a un objeto CMenu
.
BOOL LoadMenuIndirect(const void* lpMenuTemplate);
Parámetros
lpMenuTemplate
Apunta a una plantilla de menú (que es una única estructura MENUITEMTEMPLATEHEADER
y una colección de una o varias estructuras MENUITEMTEMPLATE
). Para más información sobre estas dos estructuras, consulte Windows SDK.
Valor devuelto
Distinto de cero si el recurso de menú se cargó correctamente; de lo contrario, 0.
Comentarios
Una plantilla de menú es un encabezado seguido por una colección de una o varias estructuras MENUITEMTEMPLATE
, cada una de las cuales puede contener uno o varios elementos de menú y menús emergentes.
El número de versión debería ser 0.
Las marcas mtOption
deben incluir MF_END
para el último elemento de una lista emergente y para el último elemento de la lista principal. Consulte la función miembro AppendMenu
para ver otras marcas. El miembro mtId
debe omitirse de la estructura MENUITEMTEMPLATE
cuando MF_POPUP
se especifica en mtOption
.
El espacio asignado para la estructura MENUITEMTEMPLATE
debe ser lo suficientemente grande para que mtString
contenga el nombre del elemento de menú como una cadena finalizada en null.
Antes de salir, una aplicación debe liberar recursos del sistema asociados con un menú si el menú no está asignado a una ventana. Una aplicación libera un menú al llamar a la función miembro DestroyMenu
.
Ejemplo
// 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 el manipulador HMENU
del menú de Windows adjunto al objeto CMenu
.
HMENU m_hMenu;
Ejemplo
Vea el ejemplo de CMenu::LoadMenu
.
CMenu::MeasureItem
La llama el marco cuando se crea un menú con un estilo dibujado por el propietario.
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
Parámetros
lpMeasureItemStruct
Un puntero a una estructura MEASUREITEMSTRUCT
.
Comentarios
De manera predeterminada, esta función miembro no hace nada. Invalide esta función miembro y rellene la estructura MEASUREITEMSTRUCT
para informar a Windows de las dimensiones del menú.
Consulte CWnd::OnMeasureItem
para obtener una descripción de la estructura MEASUREITEMSTRUCT
.
Ejemplo
El código siguiente procede de la muestra de CTRLTEST
de 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
Cambia un elemento de menú existente en la posición 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 el elemento de menú que se cambiará. El parámetro nFlags
se usa para interpretar nPosition
de la siguiente manera:
nFlags |
Interpretación de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
nFlags
Especifica cómo nPosition
se interpreta y proporciona información sobre los cambios que se realizarán en el elemento de menú. Para obtener una lista de las marcas que se pueden establecer, consulte la función miembro AppendMenu
.
nIDNewItem
Especifica el id. de comando del elemento de menú modificado o, si nFlags
está establecido en MF_POPUP
, el manipulador de menú (HMENU
) de un menú emergente. El parámetro nIDNewItem
se omite (no es necesario) si nFlags
se establece en MF_SEPARATOR
.
lpszNewItem
Especifica el contenido del nuevo elemento de menú. El parámetro nFlags
se usa para interpretar lpszNewItem
de la siguiente manera:
nFlags |
Interpretación de lpszNewItem |
---|---|
MF_OWNERDRAW |
Contiene un valor de 32 bits proporcionado por la aplicación que la aplicación puede usar para mantener datos adicionales asociados al elemento de menú. Este valor de 32 bits está disponible para la aplicación cuando procesa MF_MEASUREITEM y MF_DRAWITEM . |
MF_STRING |
Contiene un puntero largo a una cadena finalizada en null o a CString . |
MF_SEPARATOR |
El parámetro lpszNewItem se omite (no es necesario). |
pBmp
Apunta a un objeto CBitmap
que se usará como elemento de menú.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
La aplicación especifica el nuevo estado del elemento de menú al establecer valores en nFlags
. Si esta función reemplaza un menú emergente asociado al elemento de menú, destruye el menú emergente anterior y libera la memoria usada por el menú emergente.
Cuando nIDNewItem
especifica un menú emergente, se convierte en parte del menú al que se inserta. Si ese menú se destruye, también se destruirá el menú insertado. Se debe desasociar un menú insertado de un objeto CMenu
para evitar conflictos.
Cada vez que se cambia un menú que reside en una ventana (ya sea que se muestre o no la ventana), la aplicación debe llamar a CWnd::DrawMenuBar
. Para cambiar los atributos de los elementos de menú existentes, es mucho más rápido usar las funciones miembro CheckMenuItem
y EnableMenuItem
.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::operator HMENU
Use este operador para recuperar el manipulador del objeto CMenu
.
operator HMENU() const;
Valor devuelto
Si se ejecuta correctamente, el manipulador del objeto CMenu
; de lo contrario, NULL
.
Comentarios
Puede usar el manipulador para llamar directamente a las API de Windows.
CMenu::operator !=
Determina si dos menús no son lógicamente iguales.
BOOL operator!=(const CMenu& menu) const;
Parámetros
menu
Un objeto CMenu
para la comparación.
Comentarios
Prueba si un objeto de menú del lado izquierdo no es igual al objeto del menú del lado derecho.
CMenu::operator ==
Determina si dos menús no son lógicamente iguales.
BOOL operator==(const CMenu& menu) const;
Parámetros
menu
Un objeto CMenu
para la comparación.
Comentarios
Comprueba si un objeto de menú del lado izquierdo es igual (en términos del valor de HMENU
) a un objeto de menú del lado derecho.
CMenu::RemoveMenu
Elimina un elemento de menú con un menú emergente asociado del menú.
BOOL RemoveMenu(
UINT nPosition,
UINT nFlags);
Parámetros
nPosition
Especifica el elemento de menú que se quitará. El parámetro nFlags
se usa para interpretar nPosition
de la siguiente manera:
nFlags |
Interpretación de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
nFlags
Especifica cómo se interpreta nPosition
.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
No destruye el manipulador de un menú emergente, por lo que se puede reutilizar el menú. Antes de llamar a esta función, la aplicación puede llamar a la función miembro GetSubMenu
para recuperar el objeto emergente CMenu
y reutilizarlo.
Cada vez que se cambia un menú que reside en una ventana (ya sea que se muestre o no la ventana), la aplicación debe llamar a CWnd::DrawMenuBar
.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::SetDefaultItem
Establece el elemento de menú predeterminado para el menú especificado.
BOOL SetDefaultItem(
UINT uItem,
BOOL fByPos = FALSE);
Parámetros
uItem
Identificador o posición del nuevo elemento de menú predeterminado o - 1 para ningún elemento predeterminado. El significado de este parámetro depende del valor de fByPos
.
fByPos
Valor que especifica el significado de uItem
. Si este parámetro es FALSE
, uItem
es un identificador de elemento de menú. De lo contrario, es una posición de elemento de menú.
Valor devuelto
Si la función se realiza correctamente, el valor devuelto es distinto de cero. Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de un error extendida, use la función GetLastError
de Win32, como se describe en Windows SDK.
Comentarios
En esta función miembro, se implementa el comportamiento de la función SetMenuDefaultItem
de Win32, tal y como se describe en Windows SDK.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::SetMenuContextHelpId
Asocia un id. de ayuda de contexto a CMenu
.
BOOL SetMenuContextHelpId(DWORD dwContextHelpId);
Parámetros
dwContextHelpId
Id. de ayuda de contexto que se asociará a CMenu
.
Valor devuelto
Si es correcto, su valor es distinto de cero. En caso contrario, es 0
Comentarios
Todos los elementos del menú comparten este identificador: no es posible adjuntar un identificador contextual de ayuda a los elementos de menú individuales.
Ejemplo
Vea el ejemplo de CMenu::InsertMenu
.
CMenu::SetMenuInfo
Establece la información de un menú.
BOOL SetMenuInfo(LPCMENUINFO lpcmi);
Parámetros
lpcmi
Un puntero a una estructura MENUINFO
que contiene información para el menú.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es distinto de cero; de lo contrario, el valor devuelto es cero.
Comentarios
Llame a esta función para establecer información específica sobre el menú.
CMenu::SetMenuItemBitmaps
Asocia los mapas de bits especificados con un elemento de menú.
BOOL SetMenuItemBitmaps(
UINT nPosition,
UINT nFlags,
const CBitmap* pBmpUnchecked,
const CBitmap* pBmpChecked);
Parámetros
nPosition
Especifica el elemento de menú que se cambiará. El parámetro nFlags
se usa para interpretar nPosition
de la siguiente manera:
nFlags |
Interpretación de nPosition |
---|---|
MF_BYCOMMAND |
Especifica que el parámetro proporciona el id. de comando del elemento de menú existente. Este es el valor predeterminado si no se establece MF_BYCOMMAND ni MF_BYPOSITION . |
MF_BYPOSITION |
Especifica que el parámetro proporciona la posición del elemento de menú existente. El primer elemento está en la posición 0. |
nFlags
Especifica cómo se interpreta nPosition
.
pBmpUnchecked
Especifica el mapa de bits que se usará para los elementos de menú que no están activados.
pBmpChecked
Especifica el mapa de bits que se usará para los elementos de menú que están activados.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
Tanto si el elemento de menú está activado como desactivado, Windows muestra el mapa de bits adecuado junto al elemento de menú.
Si pBmpUnchecked
o pBmpChecked
es NULL
, Windows no muestra nada junto al elemento de menú del atributo correspondiente. Si ambos parámetros son NULL
, Windows usa la marca de verificación predeterminada cuando se activa el elemento y quita la marca de verificación cuando el elemento se desactiva.
Cuando se destruye el menú, estos mapas de bits no se destruyen; la aplicación debe destruirlas.
La función de Windows GetMenuCheckMarkDimensions
recupera las dimensiones de la marca de verificación predeterminada usada para los elementos de menú. La aplicación usa estos valores para determinar el tamaño adecuado de los mapas de bits proporcionados con esta función. Obtenga el tamaño, cree los mapas de bits y, a continuación, establézcalos.
Ejemplo
// 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
Cambia información sobre un elemento de menú.
BOOL SetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Parámetros
uItem
Consulte la descripción de uItem
en SetMenuItemInfo
en Windows SDK.
lpMenuItemInfo
Consulte la descripción de lpmii
en SetMenuItemInfo
en Windows SDK.
fByPos
Consulte la descripción de fByPosition
en SetMenuItemInfo
en Windows SDK.
Comentarios
Esta función encapsula SetMenuItemInfo
, que se describe en Windows SDK.
CMenu::TrackPopupMenu
Muestra un menú emergente flotante en la ubicación especificada y supervisa la selección de elementos en el menú emergente.
BOOL TrackPopupMenu(
UINT nFlags,
int x,
int y,
CWnd* pWnd,
LPCRECT lpRect = 0);
Parámetros
nFlags
Especifica las marcas de posición de pantalla y posición del mouse. Consulte TrackPopupMenu
para obtener una lista de marcas disponibles.
x
Especifica la posición horizontal en coordenadas de la pantalla del menú emergente. Según el valor del parámetro nFlags
, el menú puede estar alineado a la izquierda, alineado a la derecha o centrado en relación con esta posición.
y
Especifica la posición vertical en coordenadas de la pantalla de la parte superior del menú en pantalla.
pWnd
Identifica la ventana que posee el menú emergente. Este parámetro no puede ser NULL
, incluso si se especifica la marca TPM_NONOTIFY
. Esta ventana recibe todos los mensajes WM_COMMAND
del menú. En las versiones 3.1 y posteriores de Windows, la ventana no recibe mensajes de WM_COMMAND
hasta que se devuelve TrackPopupMenu
. En Windows 3.0, la ventana recibe mensajes de WM_COMMAND
antes de que se devuelva TrackPopupMenu
.
lpRect
ignorado.
Valor devuelto
Este método devuelve el resultado de llamar a TrackPopupMenu
en Windows SDK.
Comentarios
Un menú emergente flotante puede aparecer en cualquier parte de la pantalla.
Ejemplo
// 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
Muestra un menú emergente flotante en la ubicación especificada y supervisa la selección de elementos en el menú emergente.
BOOL TrackPopupMenuEx(
UINT fuFlags,
int x,
int y,
CWnd* pWnd,
LPTPMPARAMS lptpm);
Parámetros
fuFlags
Especifica varias funciones del menú extendido. Para obtener una lista de todos los valores y su significado, consulte TrackPopupMenuEx
.
x
Especifica la posición horizontal en coordenadas de la pantalla del menú emergente.
y
Especifica la posición vertical en coordenadas de la pantalla de la parte superior del menú en pantalla.
pWnd
Un puntero a la ventana que posee el menú emergente y recibe los mensajes del menú creado. Esta ventana puede ser cualquier ventana de la aplicación actual, pero no puede ser NULL
. Si especifica TPM_NONOTIFY
en el parámetro fuFlags
, la función no envía ningún mensaje a pWnd
. La función debe devolver para que la ventana apuntada a pWnd
reciba el mensaje de WM_COMMAND
.
lptpm
Puntero a una estructura TPMPARAMS
que especifica un área de la pantalla con la que el menú no debe superponerse. Este parámetro puede ser NULL
.
Valor devuelto
Si especifica TPM_RETURNCMD
en el parámetro fuFlags
, el valor devuelto es el identificador de elemento de menú del elemento seleccionado por el usuario. Si el usuario cancela el menú sin realizar una selección, o si se produce un error, el valor devuelto es 0.
Si no especifica TPM_RETURNCMD
en el parámetro fuFlags
, el valor devuelto es distinto de cero si la función se realiza correctamente y 0 si se produce un error. Para obtener información de errores extendida, realice una llamada a GetLastError
.
Comentarios
Un menú emergente flotante puede aparecer en cualquier parte de la pantalla. Para obtener más información sobre el control de errores al crear el menú emergente, consulte TrackPopupMenuEx
.
Consulte también
Ejemplo de MFCCTRLTEST
Ejemplo de MFCDYNAMENU
CObject
(clase)
Gráfico de jerarquías