Sdílet prostřednictvím


CMenu Třída

Zapouzdření systému Windows HMENU.

Syntaxe

class CMenu : public CObject

Členové

Veřejné konstruktory

Název Popis
CMenu::CMenu CMenu Vytvoří objekt.

Veřejné metody

Název Popis
CMenu::AppendMenu Připojí novou položku na konec této nabídky.
CMenu::Attach Připojí úchyt nabídky Systému Windows k objektu CMenu .
CMenu::CheckMenuItem Umístí značku zaškrtnutí vedle položky nabídky nebo ji odebere z položky nabídky v místní nabídce.
CMenu::CheckMenuRadioItem Umístí přepínač vedle položky nabídky a odebere přepínač ze všech ostatních položek nabídky ve skupině.
CMenu::CreateMenu Vytvoří prázdnou nabídku a připojí ji k objektu CMenu .
CMenu::CreatePopupMenu Vytvoří prázdnou místní nabídku a připojí ji k objektu CMenu .
CMenu::DeleteMenu Odstraní zadanou položku z nabídky. Pokud má položka nabídky přidruženou místní nabídku, zničí úchyt do místní nabídky a uvolní paměť používanou touto položkou.
CMenu::DeleteTempMap Odstraní všechny dočasné CMenu objekty vytvořené členkou FromHandle funkce.
CMenu::DestroyMenu Zničí nabídku připojenou k objektu CMenu a uvolní veškerou paměť, kterou nabídka zabírá.
CMenu::Detach Odpojte úchyt nabídky Systému Windows od objektu CMenu a vrátí popisovač.
CMenu::DrawItem Volá se podle architektury, když se změní vizuální aspekt nabídky nakreslené vlastníkem.
CMenu::EnableMenuItem Povolí, zakáže nebo ztlumí (šedé) položku nabídky.
CMenu::FromHandle Vrátí ukazatel na CMenu objekt, který má popisovač nabídky Windows.
CMenu::GetDefaultItem Určuje výchozí položku nabídky v zadané nabídce.
CMenu::GetMenuContextHelpId Načte kontextové ID nápovědy přidružené k nabídce.
CMenu::GetMenuInfo Načte informace v konkrétní nabídce.
CMenu::GetMenuItemCount Určuje počet položek v místní nebo nejvyšší nabídce.
CMenu::GetMenuItemID Získá identifikátor položky nabídky pro položku nabídky umístěnou v zadané pozici.
CMenu::GetMenuItemInfo Načte informace o položce nabídky.
CMenu::GetMenuState Vrátí stav zadané položky nabídky nebo počet položek v místní nabídce.
CMenu::GetMenuString Načte popisek zadané položky nabídky.
CMenu::GetSafeHmenu Vrátí obálku m_hMenu tohoto CMenu objektu.
CMenu::GetSubMenu Načte ukazatel na místní nabídku.
CMenu::InsertMenu Vloží novou položku nabídky na zadanou pozici a přesune další položky v nabídce dolů.
CMenu::InsertMenuItem Vloží novou položku nabídky na zadanou pozici v nabídce.
CMenu::LoadMenu Načte prostředek nabídky ze spustitelného souboru a připojí ho k objektu CMenu .
CMenu::LoadMenuIndirect Načte nabídku ze šablony nabídky v paměti a připojí ji k objektu CMenu .
CMenu::MeasureItem Volá se rozhraním k určení rozměrů nabídky při vytvoření nabídky nakreslené vlastníkem.
CMenu::ModifyMenu Změní existující položku nabídky na zadané pozici.
CMenu::RemoveMenu Odstraní položku nabídky s přidruženou místní nabídkou z zadané nabídky.
CMenu::SetDefaultItem Nastaví výchozí položku nabídky pro zadanou nabídku.
CMenu::SetMenuContextHelpId Nastaví kontextové ID nápovědy, které se má přidružit k nabídce.
CMenu::SetMenuInfo Nastaví informace v konkrétní nabídce.
CMenu::SetMenuItemBitmaps Přidruží zadané rastrové obrázky zaškrtnutí k položce nabídky.
CMenu::SetMenuItemInfo Změní informace o položce nabídky.
CMenu::TrackPopupMenu Zobrazí plovoucí místní nabídku v zadaném umístění a sleduje výběr položek v místní nabídce.
CMenu::TrackPopupMenuEx Zobrazí plovoucí místní nabídku v zadaném umístění a sleduje výběr položek v místní nabídce.

Veřejné operátory

Název Popis
CMenu::operator HMENU Načte popisovač objektu nabídky.
CMenu::operator != Určuje, zda se dva objekty nabídky nerovnají.
CMenu::operator == Určuje, zda jsou dva objekty nabídky stejné.

Veřejné datové členy

Název Popis
CMenu::m_hMenu Určuje popisovač nabídky Windows připojené k objektu CMenu .

Poznámky

Poskytuje členské funkce pro vytváření, sledování, aktualizaci a zničení nabídky.

Vytvořte CMenu objekt v rámci zásobníku jako místní a pak volejte CMenučlenské funkce, které podle potřeby manipulují s novou nabídkou. Dále voláním CWnd::SetMenu nastavíte nabídku na okno a hned za ní zavoláte členskou CMenu funkci objektu Detach . Členská CWnd::SetMenu funkce nastaví nabídku okna na novou nabídku, způsobí, že okno se překreslí tak, aby odráželo změnu nabídky a také předává vlastnictví nabídky do okna. Volání Detach pro odpojení HMENU od objektu CMenu , takže když místní CMenu proměnná projde mimo rozsah, CMenu destruktor objektu se nepokouší zničit nabídku, kterou už vlastní. Samotná nabídka se automaticky zničí při zničení okna.

Členovou funkci můžete použít LoadMenuIndirect k vytvoření nabídky ze šablony v paměti, ale nabídka vytvořená z prostředku voláním LoadMenu je snadněji udržovaná a samotný prostředek nabídky lze vytvořit a upravit editorem nabídek.

Hierarchie dědičnosti

CObject

CMenu

Požadavky

Záhlaví: afxwin.h

CMenu::AppendMenu

Připojí novou položku na konec nabídky.

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

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

Parametry

nFlags
Určuje informace o stavu nové položky nabídky při přidání do nabídky. Skládá se z jedné nebo více hodnot uvedených v části Poznámky.

nIDNewItem
Určuje BUĎ ID příkazu nové položky nabídky, nebo pokud nFlags je nastavena na MF_POPUP, popisovač nabídky (HMENU) místní nabídky. Parametr nIDNewItem je ignorován (není potřeba), pokud nFlags je nastaven na MF_SEPARATOR.

lpszNewItem
Určuje obsah nové položky nabídky. Parametr nFlags se používá k interpretaci lpszNewItem následujícím způsobem:

nFlags Interpretace lpszNewItem
MF_OWNERDRAW Obsahuje 32bitovou hodnotu, kterou může aplikace použít k údržbě dalších dat přidružených k položce nabídky. Tato 32bitová hodnota je k dispozici aplikaci při zpracování WM_MEASUREITEM a WM_DRAWITEM zprávách. Hodnota je uložena v itemData členu struktury dodané s těmito zprávami.
MF_STRING Obsahuje ukazatel na řetězec ukončený hodnotou null. Toto je výchozí interpretace.
MF_SEPARATOR Parametr lpszNewItem se ignoruje (není potřeba).

pBmp
Odkazuje na CBitmap objekt, který se použije jako položka nabídky.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Aplikace může určit stav položky nabídky nastavením hodnot v nFlags. Když nIDNewItem zadáte místní nabídku, stane se součástí nabídky, ke které se připojí. Pokud je tato nabídka zničena, připojená nabídka bude také zničena. Připojená nabídka by se měla odpojit od objektu CMenu , aby nedocházelo ke konfliktu. Všimněte si, že MF_STRING a MF_OWNERDRAW nejsou platné pro rastrovou AppendMenuverzi .

Následující seznam popisuje příznaky, které mohou být nastaveny v nFlags:

  • MF_CHECKED Slouží jako přepínač MF_UNCHECKED pro umístění výchozí značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se zaškrtnutím (viz SetMenuItemBitmaps členová funkce), zobrazí se rastrový obrázek "zaškrtnutí".

  • MF_UNCHECKED Funguje jako přepínač s MF_CHECKED odebráním značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se značkami zaškrtnutí (viz SetMenuItemBitmaps členová funkce), zobrazí se rastrový obrázek "zaškrtnutí vypnuto".

  • MF_DISABLED Zakáže položku nabídky, aby ji nebylo možné vybrat, ale neztlumí ji.

  • MF_ENABLED Povolí položku nabídky, aby ji bylo možné vybrat a obnovit ze zašedlého stavu.

  • MF_GRAYED Zakáže položku nabídky, aby ji nebylo možné vybrat a ztlumit.

  • MF_MENUBARBREAK Umístí položku na nový řádek do statických nabídek nebo do nového sloupce v automaticky otevíraných nabídkách. Nový sloupec místní nabídky bude oddělený od starého sloupce svislým dělením.

  • MF_MENUBREAK Umístí položku na nový řádek do statických nabídek nebo do nového sloupce v automaticky otevíraných nabídkách. Mezi sloupci není umístěna žádná dělicí čára.

  • MF_OWNERDRAW Určuje, že položka je položka pro kreslení vlastníkem. Při prvním zobrazení nabídky obdrží okno, které vlastní nabídku WM_MEASUREITEM , zprávu, která načte výšku a šířku položky nabídky. Zpráva WM_DRAWITEM se odešle vždy, když vlastník musí aktualizovat vzhled vizuálu položky nabídky. Tato možnost není platná pro položku nabídky nejvyšší úrovně.

  • MF_POPUP Určuje, že položka nabídky má přidruženou místní nabídku. Parametr ID určuje popisovač místní nabídky, která má být přidružena k položce. Slouží k přidání místní nabídky nejvyšší úrovně nebo hierarchické místní nabídky k položce místní nabídky.

  • MF_SEPARATOR Nakreslí vodorovnou dělicí čáru. Dá se použít jenom v místní nabídce. Tento řádek nelze ztlumit, zakázat ani zvýraznit. Ostatní parametry se ignorují.

  • MF_STRING Určuje, že položka nabídky je řetězec znaků.

Každá z následujících skupin obsahuje příznaky, které se vzájemně vylučují a nelze je použít společně:

  • MF_DISABLED, MF_ENABLEDa MF_GRAYED

  • MF_STRING, MF_OWNERDRAW, MF_SEPARATORa rastrovou verzi

  • MF_MENUBARBREAK a MF_MENUBREAK

  • MF_CHECKED a MF_UNCHECKED

Kdykoli se změní nabídka, která se nachází v okně (ať už se okno zobrazí, nebo ne), měla by aplikace volat CWnd::DrawMenuBar.

Příklad

Podívejte se na příklad pro CMenu::CreateMenu.

CMenu::Attach

Připojí existující nabídku Windows k objektu CMenu .

BOOL Attach(HMENU hMenu);

Parametry

hMenu
Určuje popisovač nabídky Systému Windows.

Návratová hodnota

Nenulové, pokud byla operace úspěšná; jinak 0.

Poznámky

Tato funkce by neměla být volána, pokud je k objektu CMenu již připojena nabídka. Popisovač nabídky je uložen v datovém členu m_hMenu .

Pokud už je nabídka, se kterou chcete manipulovat, přidružená k oknu, můžete pomocí CWnd::GetMenu funkce získat popisovač nabídky.

Příklad

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

Přidá značky zaškrtnutí nebo odebere značky zaškrtnutí z položek nabídky v místní nabídce.

UINT CheckMenuItem(
    UINT nIDCheckItem,
    UINT nCheck);

Parametry

nIDCheckItem
Určuje položku nabídky, která má být kontrolována nCheckpodle .

nCheck
Určuje, jak zkontrolovat položku nabídky a jak určit pozici položky v nabídce. Parametr nCheck může být kombinací MF_CHECKED nebo MF_UNCHECKED příznakem MF_BYPOSITION MF_BYCOMMAND . Tyto příznaky lze kombinovat pomocí bitové operátoru OR. Mají následující významy:

  • MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Tato možnost je výchozí.

  • MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

  • MF_CHECKED Slouží jako přepínač MF_UNCHECKED pro umístění výchozí značky zaškrtnutí vedle položky.

  • MF_UNCHECKED Funguje jako přepínač s MF_CHECKED odebráním značky zaškrtnutí vedle položky.

Návratová hodnota

Předchozí stav položky: MF_CHECKED nebo MF_UNCHECKEDnebo 0xFFFFFFFF pokud položka nabídky neexistovala.

Poznámky

Parametr nIDCheckItem určuje položku, kterou chcete upravit.

Parametr nIDCheckItem může identifikovat položku místní nabídky i položku nabídky. Ke kontrole položky místní nabídky nejsou potřeba žádné zvláštní kroky. Položky nabídky nejvyšší úrovně nelze zkontrolovat. Položku místní nabídky je nutné zkontrolovat podle pozice, protože k ní není přidružený identifikátor položky nabídky.

Příklad

Podívejte se na příklad pro CMenu::GetMenuState.

CMenu::CheckMenuRadioItem

Zkontroluje zadanou položku nabídky a nastaví ji jako přepínač.

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

Parametry

nIDFirst
Určuje (jako ID nebo posun v závislosti na hodnotě nFlags) první položku nabídky ve skupině přepínačů.

nIDLast
Určuje (jako ID nebo posun v závislosti na hodnotě nFlags) poslední položku nabídky ve skupině přepínačů.

nIDItem
Určuje (jako ID nebo posun v závislosti na hodnotě nFlags) položku ve skupině, která bude kontrolována pomocí přepínače.

nFlags
Určuje interpretaci nIDFirst, nIDLasta nIDItem to následujícím způsobem:

nFlags Interpretace
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

Návratová hodnota

Nenulové, pokud je úspěšné; jinak 0

Poznámky

Funkce současně zruší zaškrtnutí všech ostatních položek nabídky v přidružené skupině a vymaže příznak typu přepínač pro tyto položky. Zaškrtnutá položka se místo rastrového obrázku zaškrtnutí zobrazí pomocí přepínače (nebo rastrového obrázku s odrážkou).

Příklad

Podívejte se na příklad pro ON_COMMAND_RANGE.

CMenu::CMenu

Vytvoří prázdnou nabídku a připojí ji k objektu CMenu .

CMenu();

Poznámky

Nabídka se nevytvoří, dokud nezavoláte některou z funkcí vytvoření nebo načtení členů CMenu:

CMenu::CreateMenu

Vytvoří nabídku a připojí ji k objektu CMenu .

BOOL CreateMenu();

Návratová hodnota

Nenulové, pokud byla nabídka úspěšně vytvořena; jinak 0.

Poznámky

Nabídka je zpočátku prázdná. Položky nabídky lze přidat pomocí funkce nebo InsertMenu členaAppendMenu.

Pokud je nabídka přiřazena k okně, je automaticky zničena při zničení okna.

Před ukončením aplikace musí uvolnit systémové prostředky přidružené k nabídce, pokud není nabídka přiřazena k oknem. Aplikace uvolní nabídku voláním DestroyMenu členské funkce.

Příklad

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

Vytvoří místní nabídku a připojí ji k objektu CMenu .

BOOL CreatePopupMenu();

Návratová hodnota

Nenulové, pokud se místní nabídka úspěšně vytvořila; jinak 0.

Poznámky

Nabídka je zpočátku prázdná. Položky nabídky lze přidat pomocí funkce nebo InsertMenu členaAppendMenu. Aplikace může přidat místní nabídku do existující nabídky nebo místní nabídky. Členová TrackPopupMenu funkce se může použít k zobrazení této nabídky jako plovoucí místní nabídky a ke sledování výběrů v místní nabídce.

Pokud je nabídka přiřazena k okně, je automaticky zničena při zničení okna. Pokud je nabídka přidána do existující nabídky, je automaticky zničena při zničení této nabídky.

Před ukončením aplikace musí uvolnit systémové prostředky přidružené k místní nabídce, pokud není nabídka přiřazena k oknu. Aplikace uvolní nabídku voláním DestroyMenu členské funkce.

Příklad

Podívejte se na příklad pro CMenu::CreateMenu.

CMenu::DeleteMenu

Odstraní položku z nabídky.

BOOL DeleteMenu(
    UINT nPosition,
    UINT nFlags);

Parametry

nPosition
Určuje položku nabídky, která má být odstraněna nFlagspodle .

nFlags
Slouží k interpretaci nPosition následujícím způsobem:

nFlags Interpretace nPosition
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Pokud má položka nabídky přidruženou místní nabídku, DeleteMenu zničí úchyt do místní nabídky a uvolní paměť používanou místní nabídkou.

Kdykoli se změní nabídka, která se nachází v okně (zda se okno zobrazí, nebo ne), musí aplikace volat CWnd::DrawMenuBar.

Příklad

Podívejte se na příklad pro CWnd::GetMenu.

CMenu::DeleteTempMap

Volá se automaticky obslužnou rutinou CWinApp nečinnosti a odstraní všechny dočasné CMenu objekty vytvořené členovou FromHandle funkcí.

static void PASCAL DeleteTempMap();

Poznámky

DeleteTempMap Před odstraněním objektu odpojte objekt nabídky Systému Windows připojený k dočasnému CMenu objektu CMenu .

Příklad

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

CMenu::DestroyMenu

Zničí nabídku a všechny použité prostředky Windows.

BOOL DestroyMenu();

Návratová hodnota

Nenulové, pokud je nabídka zničena; jinak 0.

Poznámky

Nabídka je odpojena od objektu CMenu před zničením. Funkce Windows DestroyMenu se automaticky volá v CMenu destruktoru.

Příklad

Podívejte se na příklad pro CMenu::CreateMenu.

CMenu::Detach

Odpojte nabídku Windows od objektu CMenu a vrátí popisovač.

HMENU Detach();

Návratová hodnota

Popisovač typu HMENU, do nabídky Windows, pokud je úspěšný; jinak NULL.

Poznámky

Datový m_hMenu člen je nastaven na NULLhodnotu .

Příklad

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

Volá se podle architektury, když se změní vizuální aspekt nabídky nakreslené vlastníkem.

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

Parametry

lpDrawItemStruct
Ukazatel na DRAWITEMSTRUCT strukturu, která obsahuje informace o typu požadovaného výkresu.

Poznámky

Člen itemAction DRAWITEMSTRUCT struktury definuje akci výkresu, která se má provést. Přepište tuto členovou funkci tak, aby implementovaly výkres pro objekt pro kreslení CMenu vlastníka. Aplikace by měla obnovit všechny objekty rozhraní grafického zařízení (GDI) vybrané pro kontext zobrazení zadaný lpDrawItemStruct před ukončením této členské funkce.

Podívejte CWnd::OnDrawItem se na popis DRAWITEMSTRUCT struktury.

Příklad

Následující kód pochází z ukázky MFC 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

Povolí, zakáže nebo ztlumí položku nabídky.

UINT EnableMenuItem(
    UINT nIDEnableItem,
    UINT nEnable);

Parametry

nIDEnableItem
Určuje položku nabídky, která má být povolena podle .nEnable Tento parametr může zadat položky místní nabídky i standardní položky nabídky.

nEnable
Určuje akci, která se má provést. Může to být kombinace MF_DISABLED, MF_ENABLEDnebo MF_GRAYED, s MF_BYCOMMAND nebo MF_BYPOSITION. Tyto hodnoty lze kombinovat pomocí bitového operátoru OR jazyka C++.| Tyto hodnoty mají následující významy:

  • MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Tato možnost je výchozí.

  • MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

  • MF_DISABLED Zakáže položku nabídky, aby ji nebylo možné vybrat, ale neztlumí ji.

  • MF_ENABLED Povolí položku nabídky, aby ji bylo možné vybrat a obnovit ze zašedlého stavu.

  • MF_GRAYED Zakáže položku nabídky, aby ji nebylo možné vybrat a ztlumit.

Návratová hodnota

Předchozí stav (MF_DISABLED, MF_ENABLEDnebo ) nebo MF_GRAYED-1, pokud není platný.

Poznámky

Členské CreateMenufunkce , InsertMenu, ModifyMenua LoadMenuIndirect mohou také nastavit stav (povoleno, zakázáno nebo neaktivní) položky nabídky.

MF_BYPOSITION Použití hodnoty vyžaduje, aby aplikace používala správnou CMenuhodnotu . CMenu Pokud se použije řádek nabídek, ovlivní se položka nabídky nejvyšší úrovně (položka na řádku nabídek). Pokud chcete nastavit stav položky v místní nebo vnořené místní nabídce podle pozice, musí aplikace zadat CMenu místní nabídku.

Pokud aplikace určuje MF_BYCOMMAND příznak, systém Windows zkontroluje všechny položky místní nabídky, které jsou podřízené CMenupožadavkům , a proto pokud nejsou k dispozici duplicitní položky nabídky, je použití CMenu řádku nabídek dostatečné.

Příklad

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

Vrátí ukazatel na CMenu objekt zadaný popisovačem Windows do nabídky.

static CMenu* PASCAL FromHandle(HMENU hMenu);

Parametry

hMenu
Popisovač Windows v nabídce.

Návratová hodnota

Ukazatel na dočasný CMenu nebo trvalý ukazatel.

Poznámky

CMenu Pokud objekt ještě není připojený k objektu nabídky Systému Windows, vytvoří se dočasný CMenu objekt a připojí se.

Tento dočasný CMenu objekt je platný pouze do okamžiku, kdy aplikace bude ve smyčce událostí nečinná, kdy se odstraní všechny dočasné objekty.

Příklad

Podívejte se na příklad pro CMenu::CreateMenu.

CMenu::GetDefaultItem

Určuje výchozí položku nabídky v zadané nabídce.

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

Parametry

gmdiFlags
Hodnota určující, jak funkce hledá položky nabídky. Tento parametr může být žádný, jeden nebo kombinace následujících hodnot:

Hodnota Význam
GMDI_GOINTOPOPUPS Určuje, že pokud je výchozí položka, která otevře podnabídku, bude funkce prohledávat v odpovídající podnabídce rekurzivně. Pokud podnabídka nemá žádnou výchozí položku, vrátí se hodnota označující položku, která otevře podnabídku.

Ve výchozím nastavení vrátí funkce první výchozí položku v zadané nabídce bez ohledu na to, jestli se jedná o položku, která otevře podnabídku.
GMDI_USEDISABLED Určuje, že funkce má vrátit výchozí položku, i když je zakázaná.

Ve výchozím nastavení funkce přeskočí zakázané nebo šedé položky.

fByPos
Hodnota určující, zda se má načíst identifikátor položky nabídky nebo jeho umístění. Pokud je FALSEtento parametr, vrátí se identifikátor. V opačném případě se vrátí pozice.

Návratová hodnota

Pokud je funkce úspěšná, návratová hodnota je identifikátor nebo pozice položky nabídky. Pokud funkce selže, návratová hodnota je – 1.

Poznámky

Tato členová funkce implementuje chování funkce GetMenuDefaultItemWin32 , jak je popsáno v sadě Windows SDK.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::GetMenuContextHelpId

Načte ID kontextové nápovědy přidružené k CMenu.

DWORD GetMenuContextHelpId() const;

Návratová hodnota

ID kontextové nápovědy, ke kterému CMenu je aktuálně přidruženo, pokud má jednu; v opačném případě nulu.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::GetMenuInfo

Načte informace pro nabídku.

BOOL GetMenuInfo(LPMENUINFO lpcmi) const;

Parametry

lpcmi
Ukazatel na MENUINFO strukturu obsahující informace pro nabídku.

Návratová hodnota

Pokud je funkce úspěšná, návratová hodnota je nenulová; v opačném případě je vrácená hodnota nula.

Poznámky

Voláním této funkce načtěte informace o nabídce.

CMenu::GetMenuItemCount

Určuje počet položek v místní nebo nejvyšší nabídce.

UINT GetMenuItemCount() const;

Návratová hodnota

Počet položek v nabídce, pokud je funkce úspěšná; jinak -1.

Příklad

Podívejte se na příklad pro CWnd::GetMenu.

CMenu::GetMenuItemID

Získá identifikátor položky nabídky pro položku nabídky umístěnou v pozici definované .nPos

UINT GetMenuItemID(int nPos) const;

Parametry

nPos
Určuje pozici (založenou na nule) položky nabídky, jejíž ID se načítá.

Návratová hodnota

ID položky pro zadanou položku v místní nabídce, pokud je funkce úspěšná. Pokud je zadaná položka místní nabídkou (na rozdíl od položky v místní nabídce), návratová hodnota je -1. Pokud nPos odpovídá SEPARATOR položce nabídky, návratová hodnota je 0.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::GetMenuItemInfo

Načte informace o položce nabídky.

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

Parametry

uItem
Identifikátor nebo umístění položky nabídky pro získání informací. Význam tohoto parametru závisí na hodnotě ByPos.

lpMenuItemInfo
Ukazatel na položku MENUITEMINFO, jak je popsáno v sadě Windows SDK, která obsahuje informace o nabídce.

fByPos
Hodnota určující význam .nIDItem Ve výchozím nastavení je FALSEto , což označuje, ByPos že uItem je identifikátor položky nabídky. Pokud ByPos není nastavena na FALSEhodnotu , označuje umístění položky nabídky.

Návratová hodnota

Pokud je funkce úspěšná, je návratová hodnota nenulová. Pokud funkce selže, návratová hodnota je nula. Pokud chcete získat rozšířené informace o chybách, použijte funkci GetLastErrorWin32, jak je popsáno v sadě Windows SDK.

Poznámky

Tato členová funkce implementuje chování funkce GetMenuItemInfoWin32, jak je popsáno v sadě Windows SDK. Všimněte si, že v implementaci GetMenuItemInfoMFC , nepoužíváte popisovač nabídky.

Příklad

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

Vrátí stav zadané položky nabídky nebo počet položek v místní nabídce.

UINT GetMenuState(
    UINT nID,
    UINT nFlags) const;

Parametry

nID
Určuje ID položky nabídky určené parametrem nFlags.

nFlags
Určuje povahu nID. Může to být jedna z následujících hodnot:

  • MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Tato možnost je výchozí.

  • MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

Návratová hodnota

Hodnota 0xFFFFFFFF , pokud zadaná položka neexistuje. Pokud nId identifikuje místní nabídku, bajt s vysokým pořadím obsahuje počet položek v místní nabídce a bajt s nízkým pořadím obsahuje příznaky nabídky přidružené k místní nabídce. V opačném případě je vrácená hodnota maska (Boolean OR) hodnot z následujícího seznamu (tato maska popisuje stav položky nabídky, která nId identifikuje):

  • MF_CHECKED Slouží jako přepínač MF_UNCHECKED pro umístění výchozí značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se zaškrtnutím (viz SetMenuItemBitmaps členová funkce), zobrazí se rastrový obrázek "zaškrtnutí".

  • MF_DISABLED Zakáže položku nabídky, aby ji nebylo možné vybrat, ale neztlumí ji.

  • MF_ENABLED Povolí položku nabídky, aby ji bylo možné vybrat a obnovit ze zašedlého stavu. Všimněte si, že hodnota této konstanty je 0; Při použití této hodnoty by aplikace neměla testovat s hodnotou 0 na selhání.

  • MF_GRAYED Zakáže položku nabídky, aby ji nebylo možné vybrat a ztlumit.

  • MF_MENUBARBREAK Umístí položku na nový řádek do statických nabídek nebo do nového sloupce v automaticky otevíraných nabídkách. Nový sloupec místní nabídky bude oddělený od starého sloupce svislým dělením.

  • MF_MENUBREAK Umístí položku na nový řádek do statických nabídek nebo do nového sloupce v automaticky otevíraných nabídkách. Mezi sloupci není umístěna žádná dělicí čára.

  • MF_SEPARATOR Nakreslí vodorovnou dělicí čáru. Dá se použít jenom v místní nabídce. Tento řádek nelze ztlumit, zakázat ani zvýraznit. Ostatní parametry se ignorují.

  • MF_UNCHECKED Funguje jako přepínač s MF_CHECKED odebráním značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se značkami zaškrtnutí (viz SetMenuItemBitmaps členová funkce), zobrazí se rastrový obrázek "zaškrtnutí vypnuto". Všimněte si, že hodnota této konstanty je 0; Při použití této hodnoty by aplikace neměla testovat s hodnotou 0 na selhání.

Příklad

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

Zkopíruje popisek zadané položky nabídky do zadané vyrovnávací paměti.

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

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

Parametry

nIDItem
Určuje celočíselnou hodnotu položky nabídky nebo posun položky nabídky v nabídce v závislosti na hodnotě nFlags.

lpString
Odkazuje na vyrovnávací paměť, která má dostat popisek.

rString
Odkaz na CString objekt, který má přijmout zkopírovaný řetězec nabídky.

nMaxCount
Určuje maximální délku (v znaky) popisku, který se má zkopírovat. Pokud je popisek delší než maximální zadaný nMaxCountpočet, zkrátí se nadbytečné znaky.

nFlags
Určuje interpretaci parametru nIDItem . Může to být jedna z následujících hodnot:

nFlags Interpretace nIDItem
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

Návratová hodnota

Určuje skutečný počet znaků zkopírovaných do vyrovnávací paměti, nikoli ukončovací znak null.

Poznámky

Parametr nMaxCount by měl být větší než počet znaků v popisku, aby se přizpůsobil znaku null, který ukončuje řetězec.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::GetSafeHmenu

Vrátí obálku HMENU tohoto CMenu objektu NULL CMenu nebo ukazatele.

HMENU GetSafeHmenu() const;

Příklad

Podívejte se na příklad pro CMenu::LoadMenu.

CMenu::GetSubMenu

CMenu Načte objekt místní nabídky.

CMenu* GetSubMenu(int nPos) const;

Parametry

nPos
Určuje umístění místní nabídky obsažené v nabídce. Hodnoty pozice začínají hodnotou 0 pro první položku nabídky. Identifikátor místní nabídky nelze v této funkci použít.

Návratová hodnota

Ukazatel na CMenu objekt, jehož m_hMenu člen obsahuje úchyt pro místní nabídku, pokud v dané pozici existuje místní nabídka; jinak NULL. CMenu Pokud objekt neexistuje, vytvoří se dočasný objekt. Vrácený CMenu ukazatel by neměl být uložen.

Příklad

Podívejte se na příklad pro CMenu::TrackPopupMenu.

CMenu::InsertMenu

Vloží novou položku nabídky na pozici určenou nPosition pomocí a přesune další položky dolů v nabídce.

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);

Parametry

nPosition
Určuje položku nabídky, před kterou se má nová položka nabídky vložit. Parametr nFlags lze použít k interpretaci nPosition následujícími způsoby:

nFlags Interpretace nPosition
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0. Pokud nPosition je -1, připojí se nová položka nabídky na konec nabídky.

nFlags
Určuje, jak nPosition se interpretuje a určuje informace o stavu nové položky nabídky při přidání do nabídky. Seznam příznaků, které mohou být nastaveny, naleznete v AppendMenu členské funkci. Pokud chcete zadat více než jednu hodnotu, pomocí bitové operátorU OR je zkombinujte s příznakem nebo MF_BYPOSITION příznakemMF_BYCOMMAND.

nIDNewItem
Určuje BUĎ ID příkazu nové položky nabídky, nebo pokud nFlags je nastavena na MF_POPUP, popisovač nabídky (HMENU) místní nabídky. Parametr nIDNewItem je ignorován (není potřeba), pokud nFlags je nastaven na MF_SEPARATOR.

lpszNewItem
Určuje obsah nové položky nabídky. nFlags lze použít k interpretaci lpszNewItem následujícími způsoby:

nFlags Interpretace lpszNewItem
MF_OWNERDRAW Obsahuje 32bitovou hodnotu, kterou může aplikace použít k údržbě dalších dat přidružených k položce nabídky. Tato 32bitová hodnota je k dispozici pro aplikaci v itemData členu struktury poskytované zprávami WM_MEASUREITEM a WM_DRAWITEM zprávami. Tyto zprávy se posílají při počátečním zobrazení nebo změně položky nabídky.
MF_STRING Obsahuje dlouhý ukazatel na řetězec ukončený hodnotou null. Toto je výchozí interpretace.
MF_SEPARATOR Parametr lpszNewItem se ignoruje (není potřeba).

pBmp
Odkazuje na CBitmap objekt, který se použije jako položka nabídky.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Aplikace může určit stav položky nabídky nastavením hodnot v nFlags.

Kdykoli se změní nabídka, která se nachází v okně (ať už se okno zobrazí, nebo ne), měla by aplikace volat CWnd::DrawMenuBar.

Když nIDNewItem zadáte místní nabídku, stane se součástí nabídky, do které se vloží. Pokud je tato nabídka zničena, vložená nabídka bude také zničena. Vložená nabídka by se měla odpojit od objektu CMenu , aby nedocházelo ke konfliktu.

Pokud je maximalizované aktivní podřízené okno více rozhraní dokumentu (MDI) a aplikace vloží do nabídky aplikace MDI místní nabídku zavoláním této funkce a zadáním příznaku MF_BYPOSITION , vloží se jedna pozice doleva, než se čekalo. K tomu dochází, protože ovládací nabídka aktivního podřízeného okna MDI se vloží do první pozice řádku nabídek okna rámečku MDI. Chcete-li správně umístit nabídku, musí aplikace přidat hodnotu 1 k hodnotě pozice, která by jinak byla použita. Aplikace může pomocí WM_MDIGETACTIVE zprávy určit, jestli je aktuálně aktivní podřízené okno maximalizované.

Příklad

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

Vloží novou položku nabídky na zadanou pozici v nabídce.

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

Parametry

uItem
Viz popis uItem v InsertMenuItem sadě Windows SDK.

lpMenuItemInfo
Viz popis lpmii v InsertMenuItem sadě Windows SDK.

fByPos
Viz popis fByPosition v InsertMenuItem sadě Windows SDK.

Poznámky

Tato funkce se zabalí InsertMenuItem, jak je popsáno v sadě Windows SDK.

CMenu::LoadMenu

Načte prostředek nabídky ze spustitelného souboru aplikace a připojí ho k objektu CMenu .

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

Parametry

lpszResourceName
Odkazuje na řetězec ukončený hodnotou null, který obsahuje název prostředku nabídky, který se má načíst.

nIDResource
Určuje ID nabídky prostředku nabídky, který se má načíst.

Návratová hodnota

Nenulové, pokud byl prostředek nabídky úspěšně načten; jinak 0.

Poznámky

Před ukončením aplikace musí uvolnit systémové prostředky přidružené k nabídce, pokud není nabídka přiřazena k oknem. Aplikace uvolní nabídku voláním DestroyMenu členské funkce.

Příklad

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

Načte prostředek ze šablony nabídky v paměti a připojí ho k objektu CMenu .

BOOL LoadMenuIndirect(const void* lpMenuTemplate);

Parametry

lpMenuTemplate
Odkazuje na šablonu nabídky (což je jedna MENUITEMTEMPLATEHEADER struktura a kolekce jedné nebo více MENUITEMTEMPLATE struktur). Další informace o těchto dvou strukturách najdete v sadě Windows SDK.

Návratová hodnota

Nenulové, pokud byl prostředek nabídky úspěšně načten; jinak 0.

Poznámky

Šablona nabídky je záhlaví následované kolekcí jedné nebo více MENUITEMTEMPLATE struktur, z nichž každá může obsahovat jednu nebo více položek nabídky a místní nabídky.

Číslo verze by mělo být 0.

Příznaky mtOption by měly obsahovat MF_END poslední položku v automaticky otevíraném seznamu a pro poslední položku v hlavním seznamu. Další příznaky najdete v AppendMenu členské funkci. Člen mtId musí být vynechán ze MENUITEMTEMPLATE struktury, pokud MF_POPUP je zadán v mtOption.

Prostor přidělený struktuře MENUITEMTEMPLATE musí být dostatečně velký, mtString aby obsahoval název položky nabídky jako řetězec ukončený hodnotou null.

Před ukončením aplikace musí uvolnit systémové prostředky přidružené k nabídce, pokud není nabídka přiřazena k oknem. Aplikace uvolní nabídku voláním DestroyMenu členské funkce.

Příklad

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

Určuje HMENU popisovač nabídky Systému Windows připojené k objektu CMenu .

HMENU m_hMenu;

Příklad

Podívejte se na příklad pro CMenu::LoadMenu.

CMenu::MeasureItem

Volá se podle architektury, když se vytvoří nabídka se stylem owner-draw.

virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

Parametry

lpMeasureItemStruct
Ukazatel na MEASUREITEMSTRUCT strukturu.

Poznámky

Ve výchozím nastavení tato členová funkce nic nedělá. Přepište tuto členskou funkci a vyplňte MEASUREITEMSTRUCT strukturu tak, aby informovala Windows o rozměrech nabídky.

Podívejte CWnd::OnMeasureItem se na popis MEASUREITEMSTRUCT struktury.

Příklad

Následující kód pochází z ukázky MFC 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

Změní existující položku nabídky na pozici určenou parametrem 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);

Parametry

nPosition
Určuje položku nabídky, kterou chcete změnit. Parametr nFlags lze použít k interpretaci nPosition následujícími způsoby:

nFlags Interpretace nPosition
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

nFlags
Určuje, jak nPosition se interpretuje, a poskytuje informace o změnách, které mají být provedeny v položce nabídky. Seznam příznaků, které mohou být nastaveny, naleznete v AppendMenu členské funkci.

nIDNewItem
Určuje BUĎ ID příkazu změněné položky nabídky, nebo pokud nFlags je nastavena na MF_POPUP, popisovač nabídky (HMENU) místní nabídky. Parametr nIDNewItem je ignorován (není potřeba), pokud nFlags je nastaven na MF_SEPARATOR.

lpszNewItem
Určuje obsah nové položky nabídky. Parametr nFlags lze použít k interpretaci lpszNewItem následujícími způsoby:

nFlags Interpretace lpszNewItem
MF_OWNERDRAW Obsahuje 32bitovou hodnotu, kterou může aplikace použít k údržbě dalších dat přidružených k položce nabídky. Tato 32bitová hodnota je k dispozici aplikaci při zpracování MF_MEASUREITEM a MF_DRAWITEM.
MF_STRING Obsahuje dlouhý ukazatel na řetězec ukončený hodnotou null nebo na CString.
MF_SEPARATOR Parametr lpszNewItem se ignoruje (není potřeba).

pBmp
Odkazuje na CBitmap objekt, který se použije jako položka nabídky.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Aplikace určuje nový stav položky nabídky nastavením hodnot v nFlags. Pokud tato funkce nahradí místní nabídku přidruženou k položce nabídky, zničí starou místní nabídku a uvolní paměť používanou místní nabídkou.

Když nIDNewItem zadáte místní nabídku, stane se součástí nabídky, do které se vloží. Pokud je tato nabídka zničena, vložená nabídka bude také zničena. Vložená nabídka by se měla odpojit od objektu CMenu , aby nedocházelo ke konfliktu.

Kdykoli se změní nabídka, která se nachází v okně (ať už se okno zobrazí, nebo ne), měla by aplikace volat CWnd::DrawMenuBar. Pokud chcete změnit atributy existujících položek nabídky, je mnohem rychlejší používat CheckMenuItem funkce a EnableMenuItem členské funkce.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::operator HMENU

Tento operátor slouží k načtení popisovače objektu CMenu .

operator HMENU() const;

Návratová hodnota

Pokud je objekt úspěšný, popisovač objektu CMenu , NULLjinak .

Poznámky

Popisovač můžete použít k přímému volání rozhraní API systému Windows.

CMenu::operator !=

Určuje, jestli se dvě nabídky logicky nerovnají.

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

Parametry

menu
Objekt CMenu pro porovnání.

Poznámky

Testuje, zda objekt nabídky na levé straně není roven objektu nabídky na pravé straně.

CMenu::operator ==

Určuje, zda jsou dvě nabídky logicky rovny.

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

Parametry

menu
Objekt CMenu pro porovnání.

Poznámky

Testuje, zda je objekt nabídky na levé straně roven objektu nabídky (z hlediska HMENU hodnoty) k objektu nabídky na pravé straně.

CMenu::RemoveMenu

Odstraní položku nabídky s přidruženou místní nabídkou z nabídky.

BOOL RemoveMenu(
    UINT nPosition,
    UINT nFlags);

Parametry

nPosition
Určuje položku nabídky, která se má odebrat. Parametr nFlags lze použít k interpretaci nPosition následujícími způsoby:

nFlags Interpretace nPosition
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

nFlags
Určuje, jak nPosition se interpretuje.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Nezničí popisovač místní nabídky, takže nabídku lze znovu použít. Před voláním této funkce může aplikace volat GetSubMenu členovou funkci, která načte automaticky otevíraný CMenu objekt pro opakované použití.

Kdykoli se změní nabídka, která se nachází v okně (zda se okno zobrazí, nebo ne), musí aplikace volat CWnd::DrawMenuBar.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::SetDefaultItem

Nastaví výchozí položku nabídky pro zadanou nabídku.

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

Parametry

uItem
Identifikátor nebo umístění nové výchozí položky nabídky nebo - 1 pro žádnou výchozí položku. Význam tohoto parametru závisí na hodnotě fByPos.

fByPos
Hodnota určující význam .uItem Pokud je FALSEtento parametr , uItem je identifikátor položky nabídky. V opačném případě se jedná o pozici položky nabídky.

Návratová hodnota

Pokud je funkce úspěšná, je návratová hodnota nenulová. Pokud funkce selže, návratová hodnota je nula. Pokud chcete získat rozšířené informace o chybách, použijte funkci GetLastErrorWin32, jak je popsáno v sadě Windows SDK.

Poznámky

Tato členová funkce implementuje chování funkce SetMenuDefaultItemWin32 , jak je popsáno v sadě Windows SDK.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::SetMenuContextHelpId

Přidruží ID nápovědy k kontextu .CMenu

BOOL SetMenuContextHelpId(DWORD dwContextHelpId);

Parametry

dwContextHelpId
ID kontextové nápovědy pro přidružení CMenu.

Návratová hodnota

Nenulové, pokud je úspěšné; jinak 0

Poznámky

Všechny položky v nabídce sdílejí tento identifikátor – není možné připojit kontextový identifikátor nápovědy k jednotlivým položkám nabídky.

Příklad

Podívejte se na příklad pro CMenu::InsertMenu.

CMenu::SetMenuInfo

Nastaví informace pro nabídku.

BOOL SetMenuInfo(LPCMENUINFO lpcmi);

Parametry

lpcmi
Ukazatel na MENUINFO strukturu obsahující informace pro nabídku.

Návratová hodnota

Pokud je funkce úspěšná, návratová hodnota je nenulová; v opačném případě je vrácená hodnota nula.

Poznámky

Voláním této funkce nastavíte konkrétní informace o nabídce.

CMenu::SetMenuItemBitmaps

Přidruží zadané rastrové obrázky k položce nabídky.

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

Parametry

nPosition
Určuje položku nabídky, kterou chcete změnit. Parametr nFlags lze použít k interpretaci nPosition následujícími způsoby:

nFlags Interpretace nPozice
MF_BYCOMMAND Určuje, že parametr poskytuje ID příkazu existující položky nabídky. Toto je výchozí nastavení, pokud MF_BYCOMMAND není nastavená ani MF_BYPOSITION žádná.
MF_BYPOSITION Určuje, že parametr dává pozici existující položky nabídky. První položka je na pozici 0.

nFlags
Určuje, jak nPosition se interpretuje.

pBmpUnchecked
Určuje rastrový obrázek, který se má použít pro položky nabídky, které nejsou zaškrtnuté.

pBmpChecked
Určuje rastrový obrázek, který se má použít pro položky nabídky, které jsou zaškrtnuté.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0.

Poznámky

Bez ohledu na to, jestli je položka nabídky zaškrtnutá nebo nezaškrtnutá, zobrazí systém Windows odpovídající rastrový obrázek vedle položky nabídky.

Pokud je nebo pBmpUnchecked pBmpChecked je NULL, systém Windows nezobrazí nic vedle položky nabídky pro odpovídající atribut. Pokud jsou NULLoba parametry , systém Windows použije výchozí značku zaškrtnutí, když je položka zaškrtnutá a odebere značku zaškrtnutí, když je položka nezaškrtnutá.

Když je nabídka zničena, tyto rastrové obrázky nejsou zničeny; aplikace je musí zničit.

Funkce Windows GetMenuCheckMarkDimensions načte rozměry výchozí značky zaškrtnutí použité pro položky nabídky. Aplikace tyto hodnoty používá k určení vhodné velikosti rastrových obrázků zadaných touto funkcí. Získejte velikost, vytvořte rastrové obrázky a nastavte je.

Příklad

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

Změní informace o položce nabídky.

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

Parametry

uItem
Viz popis uItem v SetMenuItemInfo sadě Windows SDK.

lpMenuItemInfo
Viz popis lpmii v SetMenuItemInfo sadě Windows SDK.

fByPos
Viz popis fByPosition v SetMenuItemInfo sadě Windows SDK.

Poznámky

Tato funkce se zabalí SetMenuItemInfo, jak je popsáno v sadě Windows SDK.

CMenu::TrackPopupMenu

Zobrazí plovoucí místní nabídku v zadaném umístění a sleduje výběr položek v místní nabídce.

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

Parametry

nFlags
Určuje umístění obrazovky a příznaky umístění myši. Podívejte TrackPopupMenu se na seznam dostupných příznaků.

x
Určuje vodorovnou pozici v souřadnicích obrazovky místní nabídky. V závislosti na hodnotě parametru nFlags může být nabídka zarovnaná doleva, doprava nebo na střed vzhledem k této pozici.

y
Určuje svislou pozici v souřadnicích obrazovky v horní části nabídky na obrazovce.

pWnd
Identifikuje okno, které vlastní místní nabídku. Tento parametr nemůže být NULL, a to ani v případě, že TPM_NONOTIFY je příznak zadán. Toto okno přijímá všechny WM_COMMAND zprávy z nabídky. Ve Windows verze 3.1 a novější okno nepřijímá zprávy, dokud TrackPopupMenu se nevrátíWM_COMMAND. Ve Windows 3.0 okno přijímá WM_COMMAND zprávy před TrackPopupMenu vrácením.

lpRect
Ignorovaný.

Návratová hodnota

Tato metoda vrátí výsledek volání TrackPopupMenu v sadě Windows SDK.

Poznámky

Plovoucí místní nabídka se může zobrazit kdekoli na obrazovce.

Příklad

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

Zobrazí plovoucí místní nabídku v zadaném umístění a sleduje výběr položek v místní nabídce.

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

Parametry

fuFlags
Určuje různé funkce rozšířené nabídky. Seznam všech hodnot a jejich významu naleznete v tématu TrackPopupMenuEx.

x
Určuje vodorovnou pozici v souřadnicích obrazovky místní nabídky.

y
Určuje svislou pozici v souřadnicích obrazovky v horní části nabídky na obrazovce.

pWnd
Ukazatel na okno, které vlastní místní nabídku a přijímá zprávy z vytvořené nabídky. Toto okno může být libovolné okno z aktuální aplikace, ale nemůže být NULL. Pokud zadáte TPM_NONOTIFY v parametru fuFlags , funkce neodesílá žádné zprávy do pWnd. Aby se zpráva zobrazilaWM_COMMAND, musí funkce vrátit okno, na které pWnd odkazuje.

lptpm
Ukazatel na TPMPARAMS strukturu, která určuje oblast obrazovky, by se nabídka neměla překrývat. Tento parametr může být NULL.

Návratová hodnota

Pokud zadáte TPM_RETURNCMD v parametru fuFlags , návratová hodnota je identifikátor položky nabídky, kterou uživatel vybral. Pokud uživatel nabídku zruší bez výběru nebo pokud dojde k chybě, vrátí hodnotu 0.

Pokud v parametru fuFlags nezadáteTPM_RETURNCMD, návratová hodnota je nenulová, pokud je funkce úspěšná a 0, pokud selže. Pokud chcete získat rozšířené informace o chybě, zavolejte GetLastError.

Poznámky

Plovoucí místní nabídka se může zobrazit kdekoli na obrazovce. Další informace o zpracování chyb při vytváření místní nabídky naleznete v tématu TrackPopupMenuEx.

Viz také

Mfc – ukázka CTRLTEST
Mfc – ukázka DYNAMENU
CObject Třída
Graf hierarchie