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
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 AppendMenu
verzi .
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 (vizSetMenuItemBitmaps
členová funkce), zobrazí se rastrový obrázek "zaškrtnutí".MF_UNCHECKED
Funguje jako přepínač sMF_CHECKED
odebráním značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se značkami zaškrtnutí (vizSetMenuItemBitmaps
č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ídkuWM_MEASUREITEM
, zprávu, která načte výšku a šířku položky nabídky. ZprávaWM_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_ENABLED
aMF_GRAYED
MF_STRING
,MF_OWNERDRAW
,MF_SEPARATOR
a rastrovou verziMF_MENUBARBREAK
aMF_MENUBREAK
MF_CHECKED
aMF_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 nCheck
podle .
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č sMF_CHECKED
odebráním značky zaškrtnutí vedle položky.
Návratová hodnota
Předchozí stav položky: MF_CHECKED
nebo MF_UNCHECKED
nebo 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
, nIDLast
a 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 nFlags
podle .
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 NULL
hodnotu .
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_ENABLED
nebo 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_ENABLED
nebo ) nebo MF_GRAYED
-1, pokud není platný.
Poznámky
Členské CreateMenu
funkce , InsertMenu
, ModifyMenu
a 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 CMenu
hodnotu . 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é CMenu
pož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 FALSE
tento 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 GetMenuDefaultItem
Win32 , 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 FALSE
to , což označuje, ByPos
že uItem je identifikátor položky nabídky. Pokud ByPos
není nastavena na FALSE
hodnotu , 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 GetLastError
Win32, jak je popsáno v sadě Windows SDK.
Poznámky
Tato členová funkce implementuje chování funkce GetMenuItemInfo
Win32, jak je popsáno v sadě Windows SDK. Všimněte si, že v implementaci GetMenuItemInfo
MFC , 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 (vizSetMenuItemBitmaps
č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č sMF_CHECKED
odebráním značky zaškrtnutí vedle položky. Když aplikace poskytuje rastrové obrázky se značkami zaškrtnutí (vizSetMenuItemBitmaps
č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ý nMaxCount
poč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
, NULL
jinak .
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 FALSE
tento 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 GetLastError
Win32, jak je popsáno v sadě Windows SDK.
Poznámky
Tato členová funkce implementuje chování funkce SetMenuDefaultItem
Win32 , 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 NULL
oba 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