CMenu-Klasse

Eine Kapselung von Windows- HMENU.

Syntax

class CMenu : public CObject

Member

Öffentliche Konstruktoren

Name Beschreibung
CMenu::CMenu Erstellt ein CMenu-Objekt.

Öffentliche Methoden

Name Beschreibung
CMenu::AppendMenu Fügt ein neues Element am Ende dieses Menüs an.
CMenu::Attach Fügt ein Windows-Menühandle an ein CMenu Objekt an.
CMenu::CheckMenuItem Platziert ein Häkchen neben oder entfernt ein Häkchen aus einem Menüelement im Popupmenü.
CMenu::CheckMenuRadioItem Platziert ein Optionsfeld neben einem Menüelement und entfernt das Optionsfeld aus allen anderen Menüelementen in der Gruppe.
CMenu::CreateMenu Erstellt ein leeres Menü und fügt es an ein CMenu Objekt an.
CMenu::CreatePopupMenu Erstellt ein leeres Popupmenü und fügt es an ein CMenu Objekt an.
CMenu::DeleteMenu Löscht ein angegebenes Element aus dem Menü. Wenn das Menüelement über ein zugeordnetes Popupmenü verfügt, zerstört das Handle für das Popupmenü und gibt den darin verwendeten Speicher frei.
CMenu::DeleteTempMap Löscht alle temporären CMenu Objekte, die von der FromHandle Memberfunktion erstellt wurden.
CMenu::DestroyMenu Zerstört das Menü, das an ein CMenu Objekt angefügt ist, und gibt alle Arbeitsspeicher frei, die das Menü belegt hat.
CMenu::Detach Trennt ein Windows-Menühandle von einem CMenu Objekt und gibt den Handle zurück.
CMenu::DrawItem Wird vom Framework aufgerufen, wenn sich ein visueller Aspekt eines vom Besitzer gezeichneten Menüs ändert.
CMenu::EnableMenuItem Aktiviert, deaktiviert oder abgeblendet (grau) ein Menüelement.
CMenu::FromHandle Gibt einen Zeiger auf ein Objekt zurück, das über ein CMenu Windows-Menühandle verfügt.
CMenu::GetDefaultItem Bestimmt das Standardmenüelement im angegebenen Menü.
CMenu::GetMenuContextHelpId Ruft die Hilfekontext-ID ab, die dem Menü zugeordnet ist.
CMenu::GetMenuInfo Ruft Informationen in einem bestimmten Menü ab.
CMenu::GetMenuItemCount Bestimmt die Anzahl der Elemente in einem Popupmenü oder einem Menü auf oberster Ebene.
CMenu::GetMenuItemID Ruft den Menüelementbezeichner für ein Menüelement an der angegebenen Position ab.
CMenu::GetMenuItemInfo Ruft Informationen zu einem Menüelement ab.
CMenu::GetMenuState Gibt den Status des angegebenen Menüelements oder die Anzahl der Elemente in einem Popupmenü zurück.
CMenu::GetMenuString Ruft die Beschriftung des angegebenen Menüelements ab.
CMenu::GetSafeHmenu Gibt den m_hMenu Umbruch dieses CMenu Objekts zurück.
CMenu::GetSubMenu Ruft einen Zeiger auf ein Popupmenü ab.
CMenu::InsertMenu Fügt ein neues Menüelement an der angegebenen Position ein, wobei andere Elemente nach unten im Menü verschoben werden.
CMenu::InsertMenuItem Fügt ein neues Menüelement an der angegebenen Position in einem Menü ein.
CMenu::LoadMenu Lädt eine Menüressource aus der ausführbaren Datei und fügt sie an ein CMenu Objekt an.
CMenu::LoadMenuIndirect Lädt ein Menü aus einer Menüvorlage im Arbeitsspeicher und fügt es an ein CMenu Objekt an.
CMenu::MeasureItem Wird vom Framework aufgerufen, um Menüdimensionen zu bestimmen, wenn ein vom Besitzer gezeichnetes Menü erstellt wird.
CMenu::ModifyMenu Ändert ein vorhandenes Menüelement an der angegebenen Position.
CMenu::RemoveMenu Löscht ein Menüelement mit einem zugeordneten Popupmenü aus dem angegebenen Menü.
CMenu::SetDefaultItem Legt das Standardmenüelement für das angegebene Menü fest.
CMenu::SetMenuContextHelpId Legt die Hilfekontext-ID fest, die dem Menü zugeordnet werden soll.
CMenu::SetMenuInfo Legt Informationen für ein bestimmtes Menü fest.
CMenu::SetMenuItemBitmaps Ordnet die angegebenen Häkchenbitmaps einem Menüelement zu.
CMenu::SetMenuItemInfo Ändert Informationen zu einem Menüelement.
CMenu::TrackPopupMenu Zeigt ein unverankertes Popupmenü an der angegebenen Position an und verfolgt die Auswahl von Elementen im Popupmenü.
CMenu::TrackPopupMenuEx Zeigt ein unverankertes Popupmenü an der angegebenen Position an und verfolgt die Auswahl von Elementen im Popupmenü.

Öffentliche Operatoren

Name Beschreibung
CMenu::operator HMENU Ruft das Handle des Menüobjekts ab.
CMenu::operator != Bestimmt, ob zwei Menüobjekte nicht gleich sind.
CMenu::operator == Bestimmt, ob zwei Menüobjekte gleich sind.

Öffentliche Datenmember

Name Beschreibung
CMenu::m_hMenu Gibt das Handle an, das dem Objekt zugeordnet ist CMenu .

Hinweise

Es stellt Memberfunktionen zum Erstellen, Nachverfolgen, Aktualisieren und Zerstören eines Menüs bereit.

Erstellen Sie ein CMenu Objekt im Stapelframe als lokal, und rufen Sie CMenudann die Memberfunktionen auf, um das neue Menü nach Bedarf zu bearbeiten. Rufen Sie CWnd::SetMenu als Nächstes auf, um das Menü auf ein Fenster festzulegen, gefolgt von einem Aufruf der Memberfunktion des CMenuDetach Objekts. Die CWnd::SetMenu Memberfunktion legt das Menü des Fensters auf das neue Menü fest, bewirkt, dass das Fenster neu gezeichnet wird, um die Menüänderung widerzuspiegeln, und übergibt auch den Besitz des Menüs an das Fenster. Durch den Aufruf zum Detach Trennen des CMenu Objekts wird das HMENU Objekt getrennt. Wenn die lokale CMenu Variable den Bereich übergibt, versucht der CMenu Objektdestruktor nicht, ein Menü zu zerstören, das er nicht mehr besitzt. Das Menü selbst wird automatisch zerstört, wenn das Fenster zerstört wird.

Sie können die LoadMenuIndirect Memberfunktion verwenden, um ein Menü aus einer Vorlage im Arbeitsspeicher zu erstellen, aber ein Menü, das von einer Ressource durch einen Aufruf LoadMenu erstellt wird, ist einfacher Standard tained, und die Menüressource selbst kann vom Menü-Editor erstellt und geändert werden.

Vererbungshierarchie

CObject

CMenu

Anforderungen

Headerafxwin.h:

CMenu::AppendMenu

Fügt ein neues Element am Ende eines Menüs an.

BOOL AppendMenu(
    UINT nFlags,
    UINT_PTR nIDNewItem = 0,
    LPCTSTR lpszNewItem = NULL);

BOOL AppendMenu(
    UINT nFlags,
    UINT_PTR nIDNewItem,
    const CBitmap* pBmp);

Parameter

nFlags
Gibt Informationen zum Status des neuen Menüelements an, wenn es dem Menü hinzugefügt wird. Sie besteht aus einem oder mehreren der im Abschnitt "Hinweise" aufgeführten Werte.

nIDNewItem
Gibt entweder die Befehls-ID des neuen Menüelements oder, falls nFlags festgelegt, MF_POPUPdas Menühandle (HMENU) eines Popupmenüs an. Der nIDNewItem Parameter wird ignoriert (nicht erforderlich), wenn nFlags er auf MF_SEPARATOR.

lpszNewItem
Gibt den Inhalt des neuen Menüelements an. Der nFlags Parameter wird wie folgt interpretiert lpszNewItem :

nFlags Interpretation von lpszNewItem
MF_OWNERDRAW Enthält einen von der Anwendung bereitgestellten 32-Bit-Wert, den die Anwendung verwenden kann, um dem Menüelement zugeordnete zusätzliche Daten zu Standard. Dieser 32-Bit-Wert steht der Anwendung beim Verarbeiten WM_MEASUREITEM und WM_DRAWITEM Nachrichten zur Verfügung. Der Wert wird im Element der Struktur gespeichert, die itemData mit diesen Nachrichten bereitgestellt wird.
MF_STRING Enthält einen Zeiger auf eine mit Null beendete Zeichenfolge. Dies ist die Standardinterpretation.
MF_SEPARATOR Der lpszNewItem Parameter wird ignoriert (nicht erforderlich).

pBmp
Verweist auf ein CBitmap Objekt, das als Menüelement verwendet wird.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Die Anwendung kann den Status des Menüelements durch Festlegen von Werten in nFlags. Wenn nIDNewItem ein Popupmenü angegeben wird, wird es Teil des Menüs, an das es angefügt wird. Wenn dieses Menü zerstört wird, wird auch das angefügte Menü zerstört. Ein angefügtes Menü sollte von einem CMenu Objekt getrennt werden, um Konflikte zu vermeiden. Beachten Sie, dass MF_STRING die MF_OWNERDRAW Bitmapversion von AppendMenu.

In der folgenden Liste werden die Flags beschrieben, die möglicherweise festgelegt nFlagswerden:

  • MF_CHECKED Dient als Umschaltfläche, MF_UNCHECKED um das Standardkontrollkästchen neben dem Element zu platzieren. Wenn die Anwendung Häkchenbitmaps bereitstellt (siehe Memberfunktion SetMenuItemBitmaps ), wird die Bitmap "Häkchen bei" angezeigt.

  • MF_UNCHECKED Dient als Umschaltfläche zum MF_CHECKED Entfernen eines Häkchens neben dem Element. Wenn die Anwendung Häkchenbitmaps bereitstellt (siehe Memberfunktion SetMenuItemBitmaps ), wird die Bitmap "Häkchen deaktiviert" angezeigt.

  • MF_DISABLED Deaktiviert das Menüelement, sodass es nicht ausgewählt, aber nicht abgeblendet wird.

  • MF_ENABLED Aktiviert das Menüelement, sodass es ausgewählt und aus dem abgeblendeten Zustand wiederhergestellt werden kann.

  • MF_GRAYED Deaktiviert das Menüelement, sodass es nicht ausgewählt und abgeblendet werden kann.

  • MF_MENUBARBREAK Platziert das Element in einer neuen Zeile in statischen Menüs oder in einer neuen Spalte in Popupmenüs. Die neue Popupmenüspalte wird durch eine vertikale Trennlinie von der alten Spalte getrennt.

  • MF_MENUBREAK Platziert das Element in einer neuen Zeile in statischen Menüs oder in einer neuen Spalte in Popupmenüs. Es wird keine Trennlinie zwischen den Spalten platziert.

  • MF_OWNERDRAW Gibt an, dass das Element ein Besitzer-Draw-Element ist. Wenn das Menü zum ersten Mal angezeigt wird, erhält das Fenster, das das Menü besitzt, eine WM_MEASUREITEM Nachricht, die die Höhe und Breite des Menüelements abruft. Die WM_DRAWITEM Nachricht ist die Nachricht, die gesendet wird, wenn der Besitzer die visuelle Darstellung des Menüelements aktualisieren muss. Diese Option ist für ein Menüelement der obersten Ebene ungültig.

  • MF_POPUP Gibt an, dass dem Menüelement ein Popupmenü zugeordnet ist. Der ID-Parameter gibt ein Handle für ein Popupmenü an, das dem Element zugeordnet werden soll. Dies wird zum Hinzufügen eines Popupmenüs auf oberster Ebene oder eines hierarchischen Popupmenüs zu einem Popupmenüelement verwendet.

  • MF_SEPARATOR Zeichnet eine horizontale Trennlinie. Kann nur in einem Popupmenü verwendet werden. Diese Linie kann nicht abgeblendet, deaktiviert oder hervorgehoben werden. Andere Parameter werden ignoriert.

  • MF_STRING Gibt an, dass das Menüelement eine Zeichenfolge ist.

Jede der folgenden Gruppen listet Flags auf, die sich gegenseitig ausschließen und nicht zusammen verwendet werden können:

  • MF_DISABLED, MF_ENABLED und MF_GRAYED

  • MF_STRING, MF_OWNERDRAW, MF_SEPARATORund die Bitmapversion

  • MF_MENUBARBREAK und MF_MENUBREAK

  • MF_CHECKED und MF_UNCHECKED

Wenn ein Menü, das sich in einem Fenster befindet, geändert wird (unabhängig davon, ob das Fenster angezeigt wird), sollte die Anwendung aufrufen CWnd::DrawMenuBar.

Beispiel

Sehen Sie sich das Beispiel für CMenu::CreateMenu.

CMenu::Attach

Fügt ein vorhandenes Windows-Menü an ein CMenu Objekt an.

BOOL Attach(HMENU hMenu);

Parameter

hMenu
Gibt ein Handle für ein Windows-Menü an.

Rückgabewert

Nonzero, wenn der Vorgang erfolgreich war; andernfalls 0.

Hinweise

Diese Funktion sollte nicht aufgerufen werden, wenn dem Objekt bereits ein Menü zugeordnet CMenu ist. Der Menüziehpunkt wird im m_hMenu Datenelement gespeichert.

Wenn das Menü, das Sie bearbeiten möchten, bereits einem Fenster zugeordnet ist, können Sie die CWnd::GetMenu Funktion verwenden, um ein Handle zum Menü abzurufen.

Beispiel

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

Fügt Häkchen zu Oder entfernt Häkchen aus Menüelementen im Popupmenü.

UINT CheckMenuItem(
    UINT nIDCheckItem,
    UINT nCheck);

Parameter

nIDCheckItem
Gibt das zu überprüfende Menüelement an, wie durch nCheck.

nCheck
Gibt an, wie das Menüelement überprüft und wie die Position des Elements im Menü bestimmt wird. Der nCheck Parameter kann eine Kombination aus MF_CHECKED oder MF_UNCHECKED mit oder MF_BYCOMMAND mit MF_BYPOSITION Flags sein. Diese Flags können mithilfe des bitweisen OR-Operators kombiniert werden. Sie haben die folgenden Bedeutungen:

  • MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung.

  • MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

  • MF_CHECKED Dient als Umschaltfläche, MF_UNCHECKED um das Standardkontrollkästchen neben dem Element zu platzieren.

  • MF_UNCHECKED Dient als Umschaltfläche zum MF_CHECKED Entfernen eines Häkchens neben dem Element.

Rückgabewert

Der vorherige Status des Elements: MF_CHECKED oder MF_UNCHECKED, wenn 0xFFFFFFFF das Menüelement nicht vorhanden war.

Hinweise

Der nIDCheckItem Parameter gibt das zu ändernde Element an.

Der nIDCheckItem Parameter kann ein Popupmenüelement sowie ein Menüelement identifizieren. Es sind keine speziellen Schritte erforderlich, um ein Popupmenüelement zu überprüfen. Menüelemente der obersten Ebene können nicht überprüft werden. Ein Popupmenüelement muss nach Position überprüft werden, da kein Menüelementbezeichner zugeordnet ist.

Beispiel

Sehen Sie sich das Beispiel für CMenu::GetMenuState.

CMenu::CheckMenuRadioItem

Überprüft ein angegebenes Menüelement und macht es zu einem Optionselement.

BOOL CheckMenuRadioItem(
    UINT nIDFirst,
    UINT nIDLast,
    UINT nIDItem,
    UINT nFlags);

Parameter

nIDFirst
Gibt (je nach Wert) nFlagsdas erste Menüelement in der Optionsfeldgruppe an (als ID oder Offset).

nIDLast
Gibt (je nach Wert) nFlagsdas letzte Menüelement in der Optionsfeldgruppe an (als ID oder Offset).

nIDItem
Gibt (je nach Wert) nFlagsdas Element in der Gruppe an , das mit einem Optionsfeld überprüft wird (als ID oder Offset).

nFlags
Gibt die Interpretation von nIDFirst, nIDLastund nIDItem auf folgende Weise an:

nFlags Interpretation
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

Rückgabewert

Nonzero bei erfolgreicher Ausführung; andernfalls 0

Hinweise

Gleichzeitig deaktiviert die Funktion alle anderen Menüelemente in der zugeordneten Gruppe und löscht das Optionselementtypkennzeichnung für diese Elemente. Das aktivierte Element wird mithilfe einer Optionsfeld-Bitmap (oder aufzählungszeichen) anstelle einer Häkchenbitmap angezeigt.

Beispiel

Sehen Sie sich das Beispiel für ON_COMMAND_RANGE.

CMenu::CMenu

Erstellt ein leeres Menü und fügt es an ein CMenu Objekt an.

CMenu();

Hinweise

Das Menü wird erst erstellt, wenn Sie eine der Create- oder Load-Memberfunktionen von CMenu:

CMenu::CreateMenu

Erstellt ein Menü und fügt es an das CMenu Objekt an.

BOOL CreateMenu();

Rückgabewert

Nonzero, wenn das Menü erfolgreich erstellt wurde; andernfalls 0.

Hinweise

Das Menü ist anfangs leer. Menüelemente können mithilfe der AppendMenu Funktion oder InsertMenu Member hinzugefügt werden.

Wenn das Menü einem Fenster zugewiesen ist, wird es automatisch zerstört, wenn das Fenster zerstört wird.

Vor dem Beenden muss eine Anwendung Systemressourcen freigeben, die einem Menü zugeordnet sind, wenn das Menü keinem Fenster zugewiesen ist. Eine Anwendung gibt ein Menü frei, indem die DestroyMenu Memberfunktion aufgerufen wird.

Beispiel

// 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

Erstellt ein Popupmenü und fügt es an das CMenu Objekt an.

BOOL CreatePopupMenu();

Rückgabewert

Nonzero, wenn das Popupmenü erfolgreich erstellt wurde; andernfalls 0.

Hinweise

Das Menü ist anfangs leer. Menüelemente können mithilfe der AppendMenu Funktion oder InsertMenu Member hinzugefügt werden. Die Anwendung kann das Popupmenü zu einem vorhandenen Menü oder Popupmenü hinzufügen. Die TrackPopupMenu Memberfunktion kann zum Anzeigen dieses Menüs als unverankerte Popupmenü und zum Nachverfolgen von Auswahlen im Popupmenü verwendet werden.

Wenn das Menü einem Fenster zugewiesen ist, wird es automatisch zerstört, wenn das Fenster zerstört wird. Wenn das Menü zu einem vorhandenen Menü hinzugefügt wird, wird es automatisch zerstört, wenn dieses Menü zerstört wird.

Vor dem Beenden muss eine Anwendung Systemressourcen freigeben, die einem Popupmenü zugeordnet sind, wenn das Menü keinem Fenster zugewiesen ist. Eine Anwendung gibt ein Menü frei, indem die DestroyMenu Memberfunktion aufgerufen wird.

Beispiel

Sehen Sie sich das Beispiel für CMenu::CreateMenu.

CMenu::DeleteMenu

Löscht ein Element aus dem Menü.

BOOL DeleteMenu(
    UINT nPosition,
    UINT nFlags);

Parameter

nPosition
Gibt das menüelement an, das gelöscht werden soll, wie es bestimmt wird nFlags.

nFlags
Wird verwendet, um auf folgende Weise zu interpretieren nPosition :

nFlags Interpretation von nPosition
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Wenn das Menüelement über ein zugeordnetes Popupmenü verfügt, DeleteMenu zerstört das Handle zum Popupmenü und gibt den vom Popupmenü verwendeten Speicher frei.

Wenn ein Menü, das sich in einem Fenster befindet, geändert wird (unabhängig davon, ob das Fenster angezeigt wird), muss die Anwendung aufrufen CWnd::DrawMenuBar.

Beispiel

Sehen Sie sich das Beispiel für CWnd::GetMenu.

CMenu::DeleteTempMap

Wird automatisch vom CWinApp Leerlaufzeithandler aufgerufen, werden alle temporären CMenu Objekte gelöscht, die von der FromHandle Memberfunktion erstellt wurden.

static void PASCAL DeleteTempMap();

Hinweise

DeleteTempMap trennt das Windows-Menüobjekt, das an ein temporäres CMenu Objekt angefügt ist, bevor das CMenu Objekt gelöscht wird.

Beispiel

// DeleteTempMap() is a static member and does not need
// an instantiated CMenu object.
CMenu::DeleteTempMap();

CMenu::DestroyMenu

Zerstört das Menü und alle verwendeten Windows-Ressourcen.

BOOL DestroyMenu();

Rückgabewert

Nonzero, wenn das Menü zerstört wird; andernfalls 0.

Hinweise

Das Menü wird vom CMenu Objekt getrennt, bevor es zerstört wird. Die Windows-Funktion DestroyMenu wird automatisch im CMenu Destruktor aufgerufen.

Beispiel

Sehen Sie sich das Beispiel für CMenu::CreateMenu.

CMenu::Detach

Trennt ein Windows-Menü von einem CMenu Objekt und gibt den Handle zurück.

HMENU Detach();

Rückgabewert

Das Handle vom Typ HMENU" in ein Windows-Menü, falls erfolgreich; andernfalls NULL.

Hinweise

Das m_hMenu Datenelement ist auf NULL.

Beispiel

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

Wird vom Framework aufgerufen, wenn sich ein visueller Aspekt eines vom Besitzer gezeichneten Menüs ändert.

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

Parameter

lpDrawItemStruct
Ein Zeiger auf eine DRAWITEMSTRUCT Struktur, die Informationen zum erforderlichen Zeichnungstyp enthält.

Hinweise

Das itemAction Element der DRAWITEMSTRUCT Struktur definiert die Zeichnungsaktion, die ausgeführt werden soll. Überschreiben Sie diese Memberfunktion, um die Zeichnung für ein Besitzer-Draw-Objekt CMenu zu implementieren. Die Anwendung sollte alle GDI-Objekte (Graphics Device Interface) wiederherstellen, die für den anzeigekontext ausgewählt lpDrawItemStruct wurden, bevor diese Memberfunktion beendet wird.

Eine Beschreibung der Struktur finden Sie unter.See CWnd::OnDrawItem for a description of the DRAWITEMSTRUCT structure.

Beispiel

Der folgende Code stammt aus dem MFC-Beispiel CTRLTEST :

// 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

Aktiviert, deaktiviert oder dimsiert ein Menüelement.

UINT EnableMenuItem(
    UINT nIDEnableItem,
    UINT nEnable);

Parameter

nIDEnableItem
Gibt das zu aktivierende Menüelement an, wie durch nEnable. Dieser Parameter kann Popupmenüelemente sowie Standardmenüelemente angeben.

nEnable
Gibt die auszuführende Aktion an. Es kann eine Kombination aus MF_DISABLED, , MF_ENABLEDoder MF_GRAYED, mit MF_BYCOMMAND oder MF_BYPOSITION. Diese Werte können mit dem bitweisen C++-OR-Operator (|) kombiniert werden. Diese Werte haben die folgenden Bedeutungen:

  • MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung.

  • MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

  • MF_DISABLED Deaktiviert das Menüelement, sodass es nicht ausgewählt, aber nicht abgeblendet wird.

  • MF_ENABLED Aktiviert das Menüelement, sodass es ausgewählt und aus dem abgeblendeten Zustand wiederhergestellt werden kann.

  • MF_GRAYED Deaktiviert das Menüelement, sodass es nicht ausgewählt und abgeblendet werden kann.

Rückgabewert

Vorheriger Zustand (MF_DISABLED, MF_ENABLEDoder ) oder MF_GRAYED-1, wenn ungültig.

Hinweise

Die CreateMenuFunktionen , InsertMenu, ModifyMenuund LoadMenuIndirect Member können auch den Zustand (aktiviert, deaktiviert oder abgeblendet) eines Menüelements festlegen.

Für die Verwendung des MF_BYPOSITION Werts muss eine Anwendung das richtige CMenuverwenden. Wenn die CMenu Menüleiste verwendet wird, ist ein Menüelement der obersten Ebene (ein Element in der Menüleiste) betroffen. Um den Status eines Elements in einem Popup- oder geschachtelten Popupmenü nach Position festzulegen, muss eine Anwendung das CMenu Popupmenü angeben.

Wenn eine Anwendung die MF_BYCOMMAND Kennzeichnung angibt, überprüft Windows alle Popupmenüelemente, die CMenuuntergeordnet sind. Daher reicht die Verwendung CMenu der Menüleiste aus, es sei denn, doppelte Menüelemente sind vorhanden.

Beispiel

// 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

Gibt einen Zeiger auf ein CMenu Objekt zurück, das einem Windows-Handle auf ein Menü zugewiesen ist.

static CMenu* PASCAL FromHandle(HMENU hMenu);

Parameter

hMenu
Ein Windows-Handle zu einem Menü.

Rückgabewert

Ein Zeiger auf einen CMenu , der vorübergehend oder dauerhaft sein kann.

Hinweise

Wenn ein CMenu Objekt noch nicht an das Windows-Menüobjekt angefügt ist, wird ein temporäres CMenu Objekt erstellt und angefügt.

Dieses temporäre CMenu Objekt ist nur gültig, bis die Anwendung das nächste Mal leerlauf in der Ereignisschleife hat, zu dem zeitpunkt alle temporären Objekte gelöscht werden.

Beispiel

Sehen Sie sich das Beispiel für CMenu::CreateMenu.

CMenu::GetDefaultItem

Bestimmt das Standardmenüelement im angegebenen Menü.

UINT GetDefaultItem(
    UINT gmdiFlags,
    BOOL fByPos = FALSE);

Parameter

gmdiFlags
Wert, der angibt, wie die Funktion nach Menüelementen sucht. Dieser Parameter kann keine, eine oder eine Kombination der folgenden Werte sein:

Wert Bedeutung
GMDI_GOINTOPOPUPS Gibt an, dass, wenn das Standardelement ein Untermenü ist, das ein Untermenü öffnet, die Funktion rekursiv im entsprechenden Untermenü suchen soll. Wenn das Untermenü kein Standardelement aufweist, identifiziert der Rückgabewert das Element, das das Untermenü öffnet.

Standardmäßig gibt die Funktion das erste Standardelement im angegebenen Menü zurück, unabhängig davon, ob es sich um ein Element handelt, das ein Untermenü öffnet.
GMDI_USEDISABLED Gibt an, dass die Funktion ein Standardelement zurückgibt, auch wenn es deaktiviert ist.

Standardmäßig überspringt die Funktion deaktivierte oder abgeblendte Elemente.

fByPos
Wert, der angibt, ob der Bezeichner des Menüelements oder seine Position abgerufen werden soll. Wenn dieser Parameter lautet FALSE, wird der Bezeichner zurückgegeben. Andernfalls wird die Position zurückgegeben.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert der Bezeichner oder die Position des Menüelements. Wenn die Funktion fehlschlägt, lautet der Rückgabewert - 1.

Hinweise

Diese Memberfunktion implementiert das Verhalten der Win32-Funktion GetMenuDefaultItem, wie im Windows SDK beschrieben.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::GetMenuContextHelpId

Ruft die Kontexthilfe-ID ab, die mit CMenu.

DWORD GetMenuContextHelpId() const;

Rückgabewert

Die Kontexthilfe-ID, die CMenu derzeit zugeordnet ist, wenn sie einen hat; andernfalls Null.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::GetMenuInfo

Ruft Informationen für ein Menü ab.

BOOL GetMenuInfo(LPMENUINFO lpcmi) const;

Parameter

lpcmi
Ein Zeiger auf eine MENUINFO Struktur, die Informationen für das Menü enthält.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null; andernfalls ist der Rückgabewert null.

Hinweise

Rufen Sie diese Funktion auf, um Informationen zum Menü abzurufen.

CMenu::GetMenuItemCount

Bestimmt die Anzahl der Elemente in einem Popupmenü oder einem Menü auf oberster Ebene.

UINT GetMenuItemCount() const;

Rückgabewert

Die Anzahl der Elemente im Menü, wenn die Funktion erfolgreich ist; andernfalls -1.

Beispiel

Sehen Sie sich das Beispiel für CWnd::GetMenu.

CMenu::GetMenuItemID

Ruft den Menüelementbezeichner für ein Menüelement ab, das sich an der position befindet, die durch nPos.

UINT GetMenuItemID(int nPos) const;

Parameter

nPos
Gibt die Position (nullbasiert) des Menüelements an, dessen ID abgerufen wird.

Rückgabewert

Die Element-ID für das angegebene Element in einem Popupmenü, wenn die Funktion erfolgreich ist. Wenn das angegebene Element ein Popupmenü (im Gegensatz zu einem Element im Popupmenü) ist, lautet der Rückgabewert -1. Entspricht nPos einem SEPARATOR Menüelement, lautet der Rückgabewert 0.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::GetMenuItemInfo

Ruft Informationen zu einem Menüelement ab.

BOOL GetMenuItemInfo(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

Parameter

uItem
Bezeichner oder Position des Menüelements, um Informationen zu erhalten. Die Bedeutung dieses Parameters hängt vom Wert von ByPos.

lpMenuItemInfo
Ein Zeiger auf ein MENUITEMINFO, wie im Windows SDK beschrieben, das Informationen zum Menü enthält.

fByPos
Wert, der die Bedeutung von nIDItem. Ist standardmäßig , was angibt, ByPosFALSEdass uItem ein Menüelementbezeichner ist. Wenn sie nicht auf <a0/> ByPos festgelegt ist, wird eine Menüelementposition angegeben.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null. Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, verwenden Sie die Win32-Funktion GetLastError, wie im Windows SDK beschrieben.

Hinweise

Diese Memberfunktion implementiert das Verhalten der Win32-Funktion GetMenuItemInfo, wie im Windows SDK beschrieben. Beachten Sie, dass Sie in der MFC-Implementierung von GetMenuItemInfo"Kein Handle" für ein Menü verwenden.

Beispiel

// 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

Gibt den Status des angegebenen Menüelements oder die Anzahl der Elemente in einem Popupmenü zurück.

UINT GetMenuState(
    UINT nID,
    UINT nFlags) const;

Parameter

nID
Gibt die Menüelement-ID an, wie durch nFlags.

nFlags
Gibt die Art von nID. Es kann sich um einen der folgenden Werte handeln:

  • MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung.

  • MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

Rückgabewert

Der Wert 0xFFFFFFFF , wenn das angegebene Element nicht vorhanden ist. Wenn nId ein Popupmenü identifiziert wird, enthält das Byte mit hoher Reihenfolge die Anzahl der Elemente im Popupmenü, und das Byte mit niedriger Reihenfolge enthält die Menükennzeichnungen, die dem Popupmenü zugeordnet sind. Andernfalls ist der Rückgabewert eine Maske (boolean OR) der Werte aus der folgenden Liste (diese Maske beschreibt den Status des Menüelements, das nId identifiziert):

  • MF_CHECKED Dient als Umschaltfläche, MF_UNCHECKED um das Standardkontrollkästchen neben dem Element zu platzieren. Wenn die Anwendung Häkchenbitmaps bereitstellt (siehe Memberfunktion SetMenuItemBitmaps ), wird die Bitmap "Häkchen bei" angezeigt.

  • MF_DISABLED Deaktiviert das Menüelement, sodass es nicht ausgewählt, aber nicht abgeblendet wird.

  • MF_ENABLED Aktiviert das Menüelement, sodass es ausgewählt und aus dem abgeblendeten Zustand wiederhergestellt werden kann. Beachten Sie, dass der Wert dieser Konstante 0 ist; eine Anwendung sollte bei Verwendung dieses Werts nicht auf "0" testen, wenn dieser Wert verwendet wird.

  • MF_GRAYED Deaktiviert das Menüelement, sodass es nicht ausgewählt und abgeblendet werden kann.

  • MF_MENUBARBREAK Platziert das Element in einer neuen Zeile in statischen Menüs oder in einer neuen Spalte in Popupmenüs. Die neue Popupmenüspalte wird durch eine vertikale Trennlinie von der alten Spalte getrennt.

  • MF_MENUBREAK Platziert das Element in einer neuen Zeile in statischen Menüs oder in einer neuen Spalte in Popupmenüs. Es wird keine Trennlinie zwischen den Spalten platziert.

  • MF_SEPARATOR Zeichnet eine horizontale Trennlinie. Kann nur in einem Popupmenü verwendet werden. Diese Linie kann nicht abgeblendet, deaktiviert oder hervorgehoben werden. Andere Parameter werden ignoriert.

  • MF_UNCHECKED Dient als Umschaltfläche zum MF_CHECKED Entfernen eines Häkchens neben dem Element. Wenn die Anwendung Häkchenbitmaps bereitstellt (siehe Memberfunktion SetMenuItemBitmaps ), wird die Bitmap "Häkchen deaktiviert" angezeigt. Beachten Sie, dass der Wert dieser Konstante 0 ist; eine Anwendung sollte bei Verwendung dieses Werts nicht auf "0" testen, wenn dieser Wert verwendet wird.

Beispiel

// 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

Kopiert die Beschriftung des angegebenen Menüelements in den angegebenen Puffer.

int GetMenuString(
    UINT nIDItem,
    LPTSTR lpString,
    int nMaxCount,
    UINT nFlags) const;

int GetMenuString(
    UINT nIDItem,
    CString& rString,
    UINT nFlags) const;

Parameter

nIDItem
Gibt den ganzzahligen Bezeichner des Menüelements oder den Offset des Menüelements im Menü an, abhängig vom Wert von nFlags.

lpString
Verweist auf den Puffer, der die Bezeichnung empfängt.

rString
Ein Verweis auf ein CString Objekt, das die kopierte Menüzeichenfolge empfängt.

nMaxCount
Gibt die maximale Länge (in Zeichen) der zu kopierenden Beschriftung an. Wenn die Beschriftung länger als der in der Angabe angegebene nMaxCountHöchstwert ist, werden die zusätzlichen Zeichen abgeschnitten.

nFlags
Gibt die Interpretation des nIDItem Parameters an. Es kann sich um einen der folgenden Werte handeln:

nFlags Interpretation von nIDItem
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

Rückgabewert

Gibt die tatsächliche Anzahl der zeichen an, die in den Puffer kopiert wurden, nicht einschließlich des Null-Terminators.

Hinweise

Der nMaxCount Parameter sollte größer als die Anzahl von Zeichen in der Beschriftung sein, um das NULL-Zeichen aufzunehmen, das eine Zeichenfolge beendet.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::GetSafeHmenu

Gibt den HMENU Umbruch dieses CMenu Objekts oder einen NULLCMenu Zeiger zurück.

HMENU GetSafeHmenu() const;

Beispiel

Sehen Sie sich das Beispiel für CMenu::LoadMenu.

CMenu::GetSubMenu

Ruft das CMenu Objekt eines Popupmenüs ab.

CMenu* GetSubMenu(int nPos) const;

Parameter

nPos
Gibt die Position des Popupmenüs an, das im Menü enthalten ist. Positionswerte beginnen bei 0 für das erste Menüelement. Der Bezeichner des Popupmenüs kann in dieser Funktion nicht verwendet werden.

Rückgabewert

Ein Zeiger auf ein CMenu Objekt, dessen m_hMenu Element ein Handle für das Popupmenü enthält, wenn an der angegebenen Position ein Popupmenü vorhanden ist; andernfalls NULL. Wenn kein CMenu Objekt vorhanden ist, wird ein temporäres Objekt erstellt. Der CMenu zurückgegebene Zeiger sollte nicht gespeichert werden.

Beispiel

Sehen Sie sich das Beispiel für CMenu::TrackPopupMenu.

CMenu::InsertMenu

Fügt an der angegebenen nPosition Position ein neues Menüelement ein und verschiebt andere Elemente nach unten im 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);

Parameter

nPosition
Gibt das Menüelement an, vor dem das neue Menüelement eingefügt werden soll. Der nFlags Parameter kann auf folgende Weise interpretiert nPosition werden:

nFlags Interpretation von nPosition
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0. Wenn nPosition -1 ist, wird das neue Menüelement am Ende des Menüs angefügt.

nFlags
Gibt an, wie nPosition das Menü interpretiert wird, und gibt Informationen zum Status des neuen Menüelements an, wenn es dem Menü hinzugefügt wird. Eine Liste der Kennzeichen, die festgelegt werden können, finden Sie in der AppendMenu Memberfunktion. Wenn Sie mehrere Werte angeben möchten, verwenden Sie den bitweisen OR-Operator, um sie mit dem Attribut oder MF_BYPOSITION der MF_BYCOMMAND Kennzeichnung zu kombinieren.

nIDNewItem
Gibt entweder die Befehls-ID des neuen Menüelements oder, falls nFlags festgelegt, MF_POPUPdas Menühandle (HMENU) des Popupmenüs an. Der nIDNewItem Parameter wird ignoriert (nicht erforderlich), wenn nFlags er auf MF_SEPARATOR.

lpszNewItem
Gibt den Inhalt des neuen Menüelements an. nFlags kann auf folgende Weise interpretiert lpszNewItem werden:

nFlags Interpretation von lpszNewItem
MF_OWNERDRAW Enthält einen von der Anwendung bereitgestellten 32-Bit-Wert, den die Anwendung verwenden kann, um dem Menüelement zugeordnete zusätzliche Daten zu Standard. Dieser 32-Bit-Wert steht der Anwendung im itemData Element der Struktur zur Verfügung, die von den WM_MEASUREITEM und WM_DRAWITEM den Nachrichten bereitgestellt wird. Diese Nachrichten werden gesendet, wenn das Menüelement anfangs angezeigt oder geändert wird.
MF_STRING Enthält einen langen Zeiger auf eine mit Null beendete Zeichenfolge. Dies ist die Standardinterpretation.
MF_SEPARATOR Der lpszNewItem Parameter wird ignoriert (nicht erforderlich).

pBmp
Verweist auf ein CBitmap Objekt, das als Menüelement verwendet wird.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Die Anwendung kann den Status des Menüelements durch Festlegen von Werten in nFlags.

Wenn ein Menü, das sich in einem Fenster befindet, geändert wird (unabhängig davon, ob das Fenster angezeigt wird), sollte die Anwendung aufrufen CWnd::DrawMenuBar.

Wenn nIDNewItem ein Popupmenü angegeben wird, wird es Teil des Menüs, in das es eingefügt wird. Wenn dieses Menü zerstört wird, wird auch das eingefügte Menü zerstört. Ein eingefügtes Menü sollte von einem CMenu Objekt getrennt werden, um Konflikte zu vermeiden.

Wenn das aktive untergeordnete MDI-Fenster (Multiple Document Interface) maximiert ist und eine Anwendung ein Popupmenü in das Menü der MDI-Anwendung einfügt, indem sie diese Funktion aufruft und das MF_BYPOSITION Kennzeichen angibt, wird das Menü eine Position weiter links eingefügt als erwartet. Dies geschieht, da das Steuerelementmenü des aktiven untergeordneten MDI-Fensters an der ersten Position der Menüleiste des MDI-Rahmenfensters eingefügt wird. Um das Menü ordnungsgemäß zu positionieren, muss die Anwendung dem Positionswert 1 hinzufügen, der andernfalls verwendet werden würde. Eine Anwendung kann die WM_MDIGETACTIVE Nachricht verwenden, um zu bestimmen, ob das derzeit aktive untergeordnete Fenster maximiert ist.

Beispiel

// 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

Fügt ein neues Menüelement an der angegebenen Position in einem Menü ein.

BOOL InsertMenuItem(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

Parameter

uItem
Siehe Beschreibung uItem im InsertMenuItem Windows SDK.

lpMenuItemInfo
Siehe Beschreibung lpmii im InsertMenuItem Windows SDK.

fByPos
Siehe Beschreibung fByPosition im InsertMenuItem Windows SDK.

Hinweise

Diese Funktion umschließt InsertMenuItem, die im Windows SDK beschrieben wird.

CMenu::LoadMenu

Lädt eine Menüressource aus der ausführbaren Datei der Anwendung und fügt sie an das CMenu Objekt an.

BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);

Parameter

lpszResourceName
Verweist auf eine mit Null beendete Zeichenfolge, die den Namen der zu ladenden Menüressource enthält.

nIDResource
Gibt die Menü-ID der zu ladenden Menüressource an.

Rückgabewert

Nonzero, wenn die Menüressource erfolgreich geladen wurde; andernfalls 0.

Hinweise

Vor dem Beenden muss eine Anwendung Systemressourcen freigeben, die einem Menü zugeordnet sind, wenn das Menü keinem Fenster zugewiesen ist. Eine Anwendung gibt ein Menü frei, indem die DestroyMenu Memberfunktion aufgerufen wird.

Beispiel

// 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

Lädt eine Ressource aus einer Menüvorlage im Arbeitsspeicher und fügt sie an das CMenu Objekt an.

BOOL LoadMenuIndirect(const void* lpMenuTemplate);

Parameter

lpMenuTemplate
Verweist auf eine Menüvorlage (eine einzelne MENUITEMTEMPLATEHEADER Struktur und eine Sammlung einer oder MENUITEMTEMPLATE mehrerer Strukturen). Weitere Informationen zu diesen beiden Strukturen finden Sie im Windows SDK.

Rückgabewert

Nonzero, wenn die Menüressource erfolgreich geladen wurde; andernfalls 0.

Hinweise

Eine Menüvorlage ist eine Kopfzeile, gefolgt von einer Sammlung einer oder MENUITEMTEMPLATE mehrerer Strukturen, die jeweils ein oder mehrere Menüelemente und Popupmenüs enthalten können.

Die Versionsnummer sollte 0 sein.

Die mtOption Kennzeichnungen sollten für das letzte Element in einer Popupliste und für das letzte Element in der Standard Liste enthalten MF_END sein. Weitere Flags finden Sie in der AppendMenu Memberfunktion. Das mtId Element muss bei Angabe in mtOptionder MENUITEMTEMPLATE Struktur MF_POPUP ausgelassen werden.

Der für die MENUITEMTEMPLATE Struktur zugewiesene Platz muss groß genug mtString sein, damit der Name des Menüelements als null-beendete Zeichenfolge enthalten ist.

Vor dem Beenden muss eine Anwendung Systemressourcen freigeben, die einem Menü zugeordnet sind, wenn das Menü keinem Fenster zugewiesen ist. Eine Anwendung gibt ein Menü frei, indem die DestroyMenu Memberfunktion aufgerufen wird.

Beispiel

// 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

Gibt das HMENU Handle des dem Objekt zugeordneten Windows-Menüs CMenu an.

HMENU m_hMenu;

Beispiel

Sehen Sie sich das Beispiel für CMenu::LoadMenu.

CMenu::MeasureItem

Wird vom Framework aufgerufen, wenn ein Menü mit dem Stil "Besitzer zeichnen" erstellt wird.

virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

Parameter

lpMeasureItemStruct
Ein Zeiger auf eine MEASUREITEMSTRUCT Struktur.

Hinweise

Standardmäßig führt diese Memberfunktion nichts aus. Überschreiben Sie diese Memberfunktion, und füllen Sie die MEASUREITEMSTRUCT Struktur aus, um Windows über die Abmessungen des Menüs zu informieren.

Eine Beschreibung der Struktur finden Sie unter.See CWnd::OnMeasureItem for a description of the MEASUREITEMSTRUCT structure.

Beispiel

Der folgende Code stammt aus dem MFC-Beispiel CTRLTEST :

// 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

Ändert ein vorhandenes Menüelement an der durch 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);

Parameter

nPosition
Gibt das zu ändernde Menüelement an. Der nFlags Parameter kann auf folgende Weise interpretiert nPosition werden:

nFlags Interpretation von nPosition
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

nFlags
Gibt an, wie nPosition die Interpretation erfolgt, und gibt Informationen zu den Änderungen an dem Menüelement. Eine Liste der Flags, die festgelegt werden können, finden Sie in der AppendMenu Memberfunktion.

nIDNewItem
Gibt entweder die Befehls-ID des geänderten Menüelements oder, falls nFlags festgelegt, MF_POPUPdas Menühandle (HMENU) eines Popupmenüs an. Der nIDNewItem Parameter wird ignoriert (nicht erforderlich), wenn nFlags er auf MF_SEPARATOR.

lpszNewItem
Gibt den Inhalt des neuen Menüelements an. Der nFlags Parameter kann auf folgende Weise interpretiert lpszNewItem werden:

nFlags Interpretation von lpszNewItem
MF_OWNERDRAW Enthält einen von der Anwendung bereitgestellten 32-Bit-Wert, den die Anwendung verwenden kann, um dem Menüelement zugeordnete zusätzliche Daten zu Standard. Dieser 32-Bit-Wert ist für die Anwendung verfügbar, wenn sie verarbeitet MF_MEASUREITEM und MF_DRAWITEM.
MF_STRING Enthält einen langen Zeiger auf eine mit Null beendete Zeichenfolge oder auf eine CString.
MF_SEPARATOR Der lpszNewItem Parameter wird ignoriert (nicht erforderlich).

pBmp
Verweist auf ein CBitmap Objekt, das als Menüelement verwendet wird.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Die Anwendung gibt den neuen Zustand des Menüelements durch Festlegen von Werten in nFlags. Wenn diese Funktion ein Popupmenü ersetzt, das dem Menüelement zugeordnet ist, wird das alte Popupmenü zerstört und der vom Popupmenü verwendete Speicher freigegeben.

Wenn nIDNewItem ein Popupmenü angegeben wird, wird es Teil des Menüs, in das es eingefügt wird. Wenn dieses Menü zerstört wird, wird auch das eingefügte Menü zerstört. Ein eingefügtes Menü sollte von einem CMenu Objekt getrennt werden, um Konflikte zu vermeiden.

Wenn ein Menü, das sich in einem Fenster befindet, geändert wird (unabhängig davon, ob das Fenster angezeigt wird), sollte die Anwendung aufrufen CWnd::DrawMenuBar. Um die Attribute vorhandener Menüelemente zu ändern, ist es wesentlich schneller, die CheckMenuItem Funktionen und EnableMenuItem Memberfunktionen zu verwenden.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::operator HMENU

Verwenden Sie diesen Operator, um das Handle des CMenu Objekts abzurufen.

operator HMENU() const;

Rückgabewert

Bei erfolgreicher Ausführung des Objekts; CMenu andernfalls NULL.

Hinweise

Sie können das Handle verwenden, um Windows-APIs direkt aufzurufen.

CMenu::operator !=

Bestimmt, ob zwei Menüs logisch nicht gleich sind.

BOOL operator!=(const CMenu& menu) const;

Parameter

menu
Ein CMenu-Objekt für den Vergleich.

Hinweise

Überprüft, ob ein Menüobjekt auf der linken Seite nicht mit einem Menüobjekt auf der rechten Seite identisch ist.

CMenu::operator ==

Bestimmt, ob zwei Menüs logisch gleich sind.

BOOL operator==(const CMenu& menu) const;

Parameter

menu
Ein CMenu-Objekt für den Vergleich.

Hinweise

Testet, ob ein Menüobjekt auf der linken Seite gleich (im Sinne des HMENU Werts) einem Menüobjekt auf der rechten Seite ist.

CMenu::RemoveMenu

Löscht ein Menüelement mit einem zugeordneten Popupmenü aus dem Menü.

BOOL RemoveMenu(
    UINT nPosition,
    UINT nFlags);

Parameter

nPosition
Gibt das zu entfernende Menüelement an. Der nFlags Parameter kann auf folgende Weise interpretiert nPosition werden:

nFlags Interpretation von nPosition
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

nFlags
Gibt an, wie nPosition interpretiert wird.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Es zerstört nicht den Handle für ein Popupmenü, sodass das Menü wiederverwendet werden kann. Vor dem Aufrufen dieser Funktion kann die Anwendung die GetSubMenu Memberfunktion aufrufen, um das Popupobjekt CMenu zur Wiederverwendung abzurufen.

Wenn ein Menü, das sich in einem Fenster befindet, geändert wird (unabhängig davon, ob das Fenster angezeigt wird), muss die Anwendung aufrufen CWnd::DrawMenuBar.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::SetDefaultItem

Legt das Standardmenüelement für das angegebene Menü fest.

BOOL SetDefaultItem(
    UINT uItem,
    BOOL fByPos = FALSE);

Parameter

uItem
Bezeichner oder Position des neuen Standardmenüelements oder - 1 für kein Standardelement. Die Bedeutung dieses Parameters hängt vom Wert von fByPos.

fByPos
Wert, der die Bedeutung von uItem. Wenn dieser Parameter lautet FALSE, uItem handelt es sich um einen Menüelementbezeichner. Andernfalls handelt es sich um eine Menüelementposition.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null. Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, verwenden Sie die Win32-Funktion GetLastError, wie im Windows SDK beschrieben.

Hinweise

Diese Memberfunktion implementiert das Verhalten der Win32-Funktion SetMenuDefaultItem, wie im Windows SDK beschrieben.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::SetMenuContextHelpId

Ordnet eine Kontexthilfe-ID zu CMenu.

BOOL SetMenuContextHelpId(DWORD dwContextHelpId);

Parameter

dwContextHelpId
Kontexthilfe-ID, die zugeordnet CMenuwerden soll.

Rückgabewert

Nonzero bei erfolgreicher Ausführung; andernfalls 0

Hinweise

Alle Elemente im Menü geben diesen Bezeichner frei – es ist nicht möglich, einen Hilfekontextbezeichner an die einzelnen Menüelemente anzufügen.

Beispiel

Sehen Sie sich das Beispiel für CMenu::InsertMenu.

CMenu::SetMenuInfo

Legt Informationen für ein Menü fest.

BOOL SetMenuInfo(LPCMENUINFO lpcmi);

Parameter

lpcmi
Ein Zeiger auf eine MENUINFO Struktur, die Informationen für das Menü enthält.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null; andernfalls ist der Rückgabewert null.

Hinweise

Rufen Sie diese Funktion auf, um bestimmte Informationen zum Menü festzulegen.

CMenu::SetMenuItemBitmaps

Ordnet die angegebenen Bitmaps einem Menüelement zu.

BOOL SetMenuItemBitmaps(
    UINT nPosition,
    UINT nFlags,
    const CBitmap* pBmpUnchecked,
    const CBitmap* pBmpChecked);

Parameter

nPosition
Gibt das zu ändernde Menüelement an. Der nFlags Parameter kann auf folgende Weise interpretiert nPosition werden:

nFlags Interpretation von nPosition
MF_BYCOMMAND Gibt an, dass der Parameter die Befehls-ID des vorhandenen Menüelements angibt. Dies ist die Standardeinstellung, wenn weder MF_BYCOMMANDMF_BYPOSITION noch festgelegt wird.
MF_BYPOSITION Gibt an, dass der Parameter die Position des vorhandenen Menüelements angibt. Das erste Element befindet sich an Position 0.

nFlags
Gibt an, wie nPosition interpretiert wird.

pBmpUnchecked
Gibt die Bitmap an, die für nicht aktivierte Menüelemente verwendet werden soll.

pBmpChecked
Gibt die Bitmap an, die für aktivierte Menüelemente verwendet werden soll.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Unabhängig davon, ob das Menüelement aktiviert oder deaktiviert ist, zeigt Windows die entsprechende Bitmap neben dem Menüelement an.

Wenn eine pBmpUnchecked oder pBmpChecked mehrere Elemente vorhanden sind NULL, zeigt Windows nichts neben dem Menüelement für das entsprechende Attribut an. Wenn beide Parameter sind NULL, verwendet Windows das Standard-Häkchen, wenn das Element aktiviert ist, und entfernt das Häkchen, wenn das Element deaktiviert ist.

Wenn das Menü zerstört wird, werden diese Bitmaps nicht zerstört; die Anwendung muss sie zerstören.

Die Windows-Funktion GetMenuCheckMarkDimensions ruft die Abmessungen des Standard-Häkchens ab, das für Menüelemente verwendet wird. Die Anwendung verwendet diese Werte, um die geeignete Größe für die mit dieser Funktion bereitgestellten Bitmaps zu bestimmen. Rufen Sie die Größe ab, erstellen Sie Ihre Bitmaps, und legen Sie sie fest.

Beispiel

// 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

Ändert Informationen zu einem Menüelement.

BOOL SetMenuItemInfo(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

Parameter

uItem
Siehe Beschreibung uItem im SetMenuItemInfo Windows SDK.

lpMenuItemInfo
Siehe Beschreibung lpmii im SetMenuItemInfo Windows SDK.

fByPos
Siehe Beschreibung fByPosition im SetMenuItemInfo Windows SDK.

Hinweise

Diese Funktion umschließt SetMenuItemInfo, die im Windows SDK beschrieben wird.

CMenu::TrackPopupMenu

Zeigt ein unverankertes Popupmenü an der angegebenen Position an und verfolgt die Auswahl von Elementen im Popupmenü.

BOOL TrackPopupMenu(
    UINT nFlags,
    int x,
    int y,
    CWnd* pWnd,
    LPCRECT lpRect = 0);

Parameter

nFlags
Gibt Kennzeichnungen für Bildschirmposition und Mausposition an. Eine Liste der verfügbaren Flags finden Sie unter.See TrackPopupMenu for a list of available flags.

x
Gibt die horizontale Position in Bildschirmkoordinaten des Popupmenüs an. Abhängig vom Wert des nFlags Parameters kann das Menü linksbündig, rechtsbündig oder relativ zu dieser Position zentriert werden.

y
Gibt die vertikale Position in Bildschirmkoordinaten des oberen Menüs auf dem Bildschirm an.

pWnd
Identifiziert das Fenster, das das Popupmenü besitzt. Dieser Parameter kann nicht angegeben werden NULL, auch wenn das TPM_NONOTIFY Flag angegeben ist. Dieses Fenster empfängt alle WM_COMMAND Nachrichten aus dem Menü. In Windows-Versionen 3.1 und höher empfängt WM_COMMAND das Fenster keine Nachrichten, bis sie zurückgegeben werden TrackPopupMenu . In Windows 3.0 empfängt WM_COMMAND das Fenster Nachrichten, bevor TrackPopupMenu sie zurückgegeben werden.

lpRect
Ignoriert.

Rückgabewert

Diese Methode gibt das Ergebnis des Aufrufs TrackPopupMenu im Windows SDK zurück.

Hinweise

Ein unverankerte Popupmenü kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden.

Beispiel

// 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

Zeigt ein unverankertes Popupmenü an der angegebenen Position an und verfolgt die Auswahl von Elementen im Popupmenü.

BOOL TrackPopupMenuEx(
    UINT fuFlags,
    int x,
    int y,
    CWnd* pWnd,
    LPTPMPARAMS lptpm);

Parameter

fuFlags
Gibt verschiedene Funktionen für das erweiterte Menü an. Eine Auflistung aller Werte und deren Bedeutung finden Sie unter TrackPopupMenuEx.

x
Gibt die horizontale Position in Bildschirmkoordinaten des Popupmenüs an.

y
Gibt die vertikale Position in Bildschirmkoordinaten des oberen Menüs auf dem Bildschirm an.

pWnd
Ein Zeiger auf das Fenster, das das Popupmenü besitzt und die Nachrichten aus dem erstellten Menü empfängt. Dieses Fenster kann ein beliebiges Fenster aus der aktuellen Anwendung sein, darf aber nicht sein NULL. Wenn Sie im Parameter angebenTPM_NONOTIFY, sendet die Funktion keine Nachrichten an pWnd.fuFlags Die Funktion muss für das Fenster zurückgegeben werden, auf das verwiesen wird, indem pWnd die WM_COMMAND Nachricht empfangen wird.

lptpm
Zeigen Sie auf eine TPMPARAMS Struktur, die einen Bereich des Bildschirms angibt, den das Menü nicht überlappen soll. Dieser Parameter kann NULL sein.

Rückgabewert

Wenn Sie im fuFlags Parameter angebenTPM_RETURNCMD, ist der Rückgabewert der Menüelementbezeichner des Elements, das der Benutzer ausgewählt hat. Wenn der Benutzer das Menü abbricht, ohne eine Auswahl vorzunehmen, oder wenn ein Fehler auftritt, lautet der Rückgabewert 0.

Wenn Sie den fuFlags Parameter nicht angebenTPM_RETURNCMD, ist der Rückgabewert ungleich Null, wenn die Funktion erfolgreich ist, und 0, wenn sie fehlschlägt. Um erweiterte Fehlerinformationen abzurufen, rufen Sie GetLastError auf.

Hinweise

Ein unverankerte Popupmenü kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden. Weitere Informationen zum Behandeln von Fehlern beim Erstellen des Popupmenüs finden Sie unter TrackPopupMenuEx.

Siehe auch

MFC-Beispiel CTRLTEST
MFC-Beispiel DYNAMENU
CObject Klasse
Hierarchiediagramm