Класс CMenu
Инкапсуляция HMENU
Windows.
Синтаксис
class CMenu : public CObject
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CMenu::CMenu |
Формирует объект CMenu . |
Открытые методы
Имя | Описание |
---|---|
CMenu::AppendMenu |
Добавляет новый элемент в конец этого меню. |
CMenu::Attach |
Присоединяет дескриптор меню Windows к объекту CMenu . |
CMenu::CheckMenuItem |
Поместите флажок рядом или удаляет флажок из пункта меню во всплывающем меню. |
CMenu::CheckMenuRadioItem |
Поместите переключатель рядом с элементом меню и удаляет переключатель из всех других элементов меню в группе. |
CMenu::CreateMenu |
Создает пустое меню и присоединяет его к объекту CMenu . |
CMenu::CreatePopupMenu |
Создает пустое всплывающее меню и присоединяет его к объекту CMenu . |
CMenu::DeleteMenu |
Удаляет указанный элемент из меню. Если элемент меню имеет связанное всплывающее меню, уничтожает дескриптор всплывающего меню и освобождает память, используемую им. |
CMenu::DeleteTempMap |
Удаляет все временные объекты, CMenu созданные функцией-членом FromHandle . |
CMenu::DestroyMenu |
Удаляет меню, подключенное CMenu к объекту, и освобождает любую память, занятую меню. |
CMenu::Detach |
Отсоединяет дескриптор меню Windows от CMenu объекта и возвращает дескриптор. |
CMenu::DrawItem |
Вызывается платформой при изменении визуального аспекта меню, нарисованного владельцем. |
CMenu::EnableMenuItem |
Включает, отключает или отключает (серые) пункт меню. |
CMenu::FromHandle |
Возвращает указатель на объект, заданный CMenu дескриптором меню Windows. |
CMenu::GetDefaultItem |
Определяет элемент меню по умолчанию в указанном меню. |
CMenu::GetMenuContextHelpId |
Извлекает идентификатор контекста справки, связанный с меню. |
CMenu::GetMenuInfo |
Извлекает сведения в определенном меню. |
CMenu::GetMenuItemCount |
Определяет количество элементов во всплывающем меню или меню верхнего уровня. |
CMenu::GetMenuItemID |
Получает идентификатор элемента меню для элемента меню, расположенного в указанной позиции. |
CMenu::GetMenuItemInfo |
Извлекает сведения о элементе меню. |
CMenu::GetMenuState |
Возвращает состояние указанного пункта меню или количество элементов во всплывающем меню. |
CMenu::GetMenuString |
Извлекает метку указанного элемента меню. |
CMenu::GetSafeHmenu |
Возвращает оболочку m_hMenu этого CMenu объекта. |
CMenu::GetSubMenu |
Извлекает указатель на всплывающее меню. |
CMenu::InsertMenu |
Вставляет новый пункт меню в указанное положение, перемещая другие элементы в меню. |
CMenu::InsertMenuItem |
Вставляет новый пункт меню в указанное положение в меню. |
CMenu::LoadMenu |
Загружает ресурс меню из исполняемого файла и присоединяет его к объекту CMenu . |
CMenu::LoadMenuIndirect |
Загружает меню из шаблона меню в памяти и присоединяет его к объекту CMenu . |
CMenu::MeasureItem |
Вызывается платформой для определения измерений меню при создании меню, нарисованного владельцем. |
CMenu::ModifyMenu |
Изменяет существующий пункт меню в указанной позиции. |
CMenu::RemoveMenu |
Удаляет элемент меню со связанным всплывающем меню из указанного меню. |
CMenu::SetDefaultItem |
Задает элемент меню по умолчанию для указанного меню. |
CMenu::SetMenuContextHelpId |
Задает идентификатор контекста справки, связанный с меню. |
CMenu::SetMenuInfo |
Задает сведения о определенном меню. |
CMenu::SetMenuItemBitmaps |
Связывает указанные растровые изображения флажка с элементом меню. |
CMenu::SetMenuItemInfo |
Изменяет сведения о элементе меню. |
CMenu::TrackPopupMenu |
Отображает всплывающее меню с плавающей запятой в указанном расположении и отслеживает выбор элементов во всплывающем меню. |
CMenu::TrackPopupMenuEx |
Отображает всплывающее меню с плавающей запятой в указанном расположении и отслеживает выбор элементов во всплывающем меню. |
Открытые операторы
Имя | Описание |
---|---|
CMenu::operator HMENU |
Извлекает дескриптор объекта меню. |
CMenu::operator != |
Определяет, равны ли два объекта меню. |
CMenu::operator == |
Определяет, равны ли два объекта меню. |
Открытые члены данных
Имя | Описание |
---|---|
CMenu::m_hMenu |
Задает дескриптор меню Windows, присоединенного к объекту CMenu . |
Замечания
Он предоставляет функции-члены для создания, отслеживания, обновления и уничтожения меню.
CMenu
Создайте объект в кадре стека как локальный, а затем вызовите CMenu
функции-члены для управления новым меню по мере необходимости. Затем вызов CWnd::SetMenu
, чтобы задать меню в окне, а затем сразу вызов CMenu
функции-члена объекта Detach
. Функция-член CWnd::SetMenu
задает меню окна в новое меню, приводит к повторному выводу окна для отражения изменения меню, а также передает владение меню в окно. Вызов Detach
отсоединения HMENU
от CMenu
объекта, чтобы, когда локальная CMenu
переменная выходит из области, CMenu
деструктор объекта не пытается уничтожить меню, которому он больше не принадлежит. Само меню автоматически уничтожается при уничтожении окна.
Функцию-член можно использовать LoadMenuIndirect
для создания меню из шаблона в памяти, но меню, созданное из ресурса вызовом LoadMenu
, проще поддерживать, и сам ресурс меню можно создать и изменить в редакторе меню.
Иерархия наследования
CMenu
Требования
Заголовок: afxwin.h
CMenu::AppendMenu
Добавляет новый элемент в конец меню.
BOOL AppendMenu(
UINT nFlags,
UINT_PTR nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL);
BOOL AppendMenu(
UINT nFlags,
UINT_PTR nIDNewItem,
const CBitmap* pBmp);
Параметры
nFlags
Указывает сведения о состоянии нового элемента меню при добавлении в меню. Он состоит из одного или нескольких значений, перечисленных в разделе "Примечания".
nIDNewItem
Указывает идентификатор команды нового элемента меню или, если nFlags
задано MF_POPUP
значение, дескриптор меню (HMENU
) всплывающего меню. Параметр nIDNewItem
игнорируется (не требуется), если nFlags
задано значение MF_SEPARATOR
.
lpszNewItem
Указывает содержимое нового элемента меню. Параметр nFlags
используется для интерпретации lpszNewItem
следующим образом:
nFlags |
Интерпретация lpszNewItem |
---|---|
MF_OWNERDRAW |
Содержит 32-разрядное значение, предоставленное приложением для поддержания дополнительных данных, связанных с элементом меню. Это 32-разрядное значение доступно приложению при обработке WM_MEASUREITEM и WM_DRAWITEM сообщениях. Значение хранится в itemData элементе структуры, предоставленной этими сообщениями. |
MF_STRING |
Содержит указатель на строку, завершаемую значением NULL. Это интерпретация по умолчанию. |
MF_SEPARATOR |
Параметр lpszNewItem игнорируется (не требуется). |
pBmp
Указывает на CBitmap
объект, который будет использоваться в качестве элемента меню.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Приложение может указать состояние элемента меню, задав значения в nFlags
. При nIDNewItem
указании всплывающего меню она становится частью меню, к которому он добавляется. Если это меню уничтожено, добавленное меню также будет уничтожено. Добавленное меню должно быть отсоединяется от CMenu
объекта, чтобы избежать конфликта. Обратите внимание, что MF_STRING
и MF_OWNERDRAW
недопустимы для версии растрового AppendMenu
изображения.
В следующем списке описаны флаги, которые могут быть заданы в nFlags
:
MF_CHECKED
Выполняет роль переключателя для размещения флажка по умолчанию рядом сMF_UNCHECKED
элементом. Когда приложение предоставляет растровые изображения флажка (смSetMenuItemBitmaps
. функцию-член), отображается битовое изображение с флажками.MF_UNCHECKED
Выполняет функцию переключателя, чтобы удалить флажок рядом сMF_CHECKED
элементом. Когда приложение предоставляет растровые изображения флажка (смSetMenuItemBitmaps
. функцию-член), отображается битовое изображение с флажками.MF_DISABLED
Отключает элемент меню, чтобы его нельзя было выбрать, но не отключает его.MF_ENABLED
Включает элемент меню, чтобы его можно было выбрать и восстановить из его неактивного состояния.MF_GRAYED
Отключает элемент меню, чтобы его нельзя было выбрать, и отключает его.MF_MENUBARBREAK
Помещает элемент в новую строку в статических меню или в новом столбце во всплывающих меню. Новый столбец всплывающего меню будет отделен от старого столбца вертикальной линией деления.MF_MENUBREAK
Помещает элемент в новую строку в статических меню или в новом столбце во всплывающих меню. Ни один разделительный линии не помещается между столбцами.MF_OWNERDRAW
Указывает, что элемент является элементом, нарисовавым владельцем. При первом отображении меню окно, владеющее меню, получаетWM_MEASUREITEM
сообщение, которое получает высоту и ширину элемента меню. СообщениеWM_DRAWITEM
отправляется каждый раз, когда владелец должен обновить внешний вид элемента меню. Этот параметр недопустим для элемента меню верхнего уровня.MF_POPUP
Указывает, что элемент меню имеет всплывающее меню, связанное с ним. Параметр идентификатора задает дескриптор всплывающего меню, которое должно быть связано с элементом. Это используется для добавления всплывающего меню верхнего уровня или иерархического всплывающего меню во всплывающее меню.MF_SEPARATOR
Рисует горизонтальную линию деления. Можно использовать только во всплывающем меню. Эта строка не может быть отключена, отключена или выделена. Другие параметры игнорируются.MF_STRING
Указывает, что элемент меню является символьной строкой.
Каждая из следующих групп содержит флаги, которые являются взаимоисключающими и не могут использоваться вместе:
MF_DISABLED
,MF_ENABLED
иMF_GRAYED
MF_STRING
, ,MF_OWNERDRAW
MF_SEPARATOR
и версия растрового изображенияMF_MENUBARBREAK
иMF_MENUBREAK
MF_CHECKED
иMF_UNCHECKED
Всякий раз, когда меню, размещенное в окне, изменяется (отображается ли окно), приложение должно вызываться CWnd::DrawMenuBar
.
Пример
Пример см. в примере CMenu::CreateMenu
.
CMenu::Attach
Присоединяет существующее меню Windows к объекту CMenu
.
BOOL Attach(HMENU hMenu);
Параметры
hMenu
Задает дескриптор меню Windows.
Возвращаемое значение
Ненулевое значение, если операция выполнена успешно; в противном случае — 0.
Замечания
Эта функция не должна вызываться, если меню уже подключено к объекту CMenu
. Дескриптор меню хранится в элементе m_hMenu
данных.
Если меню, которое вы хотите управлять, уже связано с окном, можно использовать CWnd::GetMenu
функцию для получения дескриптора в меню.
Пример
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
Добавляет флажки в пункты меню или удаляет их из всплывающего меню.
UINT CheckMenuItem(
UINT nIDCheckItem,
UINT nCheck);
Параметры
nIDCheckItem
Указывает элемент меню, который необходимо проверить, как определено nCheck
.
nCheck
Указывает, как проверить элемент меню и как определить положение элемента в меню. Параметр nCheck
может быть сочетанием MF_CHECKED
или MF_UNCHECKED
флагамиMF_BYPOSITION
.MF_BYCOMMAND
Эти флаги можно объединить с помощью побитового оператора OR. Они имеют следующие значения:
MF_BYCOMMAND
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию.MF_BYPOSITION
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0.MF_CHECKED
Выполняет роль переключателя для размещения флажка по умолчанию рядом сMF_UNCHECKED
элементом.MF_UNCHECKED
Выполняет функцию переключателя, чтобы удалить флажок рядом сMF_CHECKED
элементом.
Возвращаемое значение
Предыдущее состояние элемента: MF_CHECKED
или MF_UNCHECKED
, 0xFFFFFFFF
если элемент меню не существует.
Замечания
Параметр nIDCheckItem
указывает элемент, который необходимо изменить.
Параметр nIDCheckItem
может определить всплывающее меню, а также элемент меню. Для проверки всплывающего меню не требуются специальные действия. Не удается проверить элементы меню верхнего уровня. Всплывающее меню должно быть проверено по позиции, так как он не имеет идентификатора элемента меню, связанного с ним.
Пример
Пример см. в примере CMenu::GetMenuState
.
CMenu::CheckMenuRadioItem
Проверяет указанный пункт меню и делает его элементом радио.
BOOL CheckMenuRadioItem(
UINT nIDFirst,
UINT nIDLast,
UINT nIDItem,
UINT nFlags);
Параметры
nIDFirst
Указывает (как идентификатор или смещение в зависимости от значения nFlags
) первого пункта меню в группе переключателей.
nIDLast
Указывает (как идентификатор или смещение в зависимости от значения nFlags
) последнего элемента меню в группе переключателей.
nIDItem
Указывает (как идентификатор или смещение в зависимости от значения nFlags
) элемента в группе, которая будет проверяться с помощью переключателя.
nFlags
Указывает интерпретацию nIDFirst
, nIDLast
а nIDItem
также следующим образом:
nFlags | Интерпретация |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
Возвращаемое значение
Ненулевое значение при успешном выполнении; в противном случае — 0
Замечания
В то же время функция снимите флажок всех остальных элементов меню в связанной группе и очищает флаг типа радио-элемента для этих элементов. Проверяемый элемент отображается с помощью растровой кнопки (или маркера) растрового изображения вместо растрового рисунка флажка.
Пример
Пример см. в примере ON_COMMAND_RANGE
.
CMenu::CMenu
Создает пустое меню и присоединяет его к объекту CMenu
.
CMenu();
Замечания
Меню не создается, пока не вызовете одну из функций создания или загрузки элементов CMenu
:
CMenu::CreateMenu
Создает меню и присоединяет его к объекту CMenu
.
BOOL CreateMenu();
Возвращаемое значение
Ненулевое значение, если меню было создано успешно; в противном случае — 0.
Замечания
Меню изначально пусто. Элементы меню можно добавлять с помощью AppendMenu
функции-члена или InsertMenu
функции-члена.
Если меню назначено окну, оно автоматически уничтожается при уничтожении окна.
Перед выходом приложение должно освободить системные ресурсы, связанные с меню, если меню не назначено окну. Приложение освобождает меню, вызывая DestroyMenu
функцию-член.
Пример
// 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
Создает всплывающее меню и присоединяет его к объекту CMenu
.
BOOL CreatePopupMenu();
Возвращаемое значение
Ненулевое меню, если всплывающее меню успешно создано; в противном случае — 0.
Замечания
Меню изначально пусто. Элементы меню можно добавлять с помощью AppendMenu
функции-члена или InsertMenu
функции-члена. Приложение может добавить всплывающее меню в существующее меню или всплывающее меню. Функция-член TrackPopupMenu
может использоваться для отображения этого меню в виде всплывающего меню с плавающей запятой и отслеживания выбора в всплывающем меню.
Если меню назначено окну, оно автоматически уничтожается при уничтожении окна. Если меню добавляется в существующее меню, оно автоматически уничтожается при уничтожении этого меню.
Перед выходом приложение должно освободить системные ресурсы, связанные со всплывющим меню, если меню не назначено окну. Приложение освобождает меню, вызывая DestroyMenu
функцию-член.
Пример
Пример см. в примере CMenu::CreateMenu
.
CMenu::DeleteMenu
Удаляет элемент из меню.
BOOL DeleteMenu(
UINT nPosition,
UINT nFlags);
Параметры
nPosition
Указывает элемент меню, который требуется удалить, как определено nFlags
.
nFlags
Используется для интерпретации nPosition
следующим образом:
nFlags |
Интерпретация nPosition |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Если элемент меню имеет связанное всплывающее меню, DeleteMenu
уничтожает дескриптор всплывающего меню и освобождает память, используемую всплывающей меню.
Всякий раз, когда меню, которое находится в окне (отображается ли окно), приложение должно вызываться CWnd::DrawMenuBar
.
Пример
Пример см. в примере CWnd::GetMenu
.
CMenu::DeleteTempMap
Вызывается автоматически обработчиком CWinApp
времени простоя, удаляет все временные CMenu
объекты, созданные функцией-членом FromHandle
.
static void PASCAL DeleteTempMap();
Замечания
DeleteTempMap
отсоединяет объект меню Windows, подключенный к временному CMenu
объекту перед удалением CMenu
объекта.
Пример
// DeleteTempMap() is a static member and does not need
// an instantiated CMenu object.
CMenu::DeleteTempMap();
CMenu::DestroyMenu
Уничтожает меню и все используемые ресурсы Windows.
BOOL DestroyMenu();
Возвращаемое значение
Ненулевое значение, если меню уничтожено; в противном случае — 0.
Замечания
Меню отсоединяется от CMenu
объекта до его уничтожения. Функция Windows DestroyMenu
автоматически вызывается в деструкторе CMenu
.
Пример
Пример см. в примере CMenu::CreateMenu
.
CMenu::Detach
Отсоединяет меню Windows от CMenu
объекта и возвращает дескриптор.
HMENU Detach();
Возвращаемое значение
Дескриптор HMENU
типа в меню Windows, если выполнен успешно; в противном случае NULL
.
Замечания
Для m_hMenu
элемента данных задано значение NULL
.
Пример
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
Вызывается платформой при изменении визуального аспекта меню, нарисованного владельцем.
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
Параметры
lpDrawItemStruct
Указатель на DRAWITEMSTRUCT
структуру, содержащую сведения о типе документа.
Замечания
Элемент itemAction
DRAWITEMSTRUCT
структуры определяет действие рисования, которое необходимо выполнить. Переопределите эту функцию-член, чтобы реализовать рисование для объекта owner-draw CMenu
. Приложение должно восстановить все объекты интерфейса графического устройства (GDI), выбранные для контекста отображения, предоставленного lpDrawItemStruct
перед завершением этой функции-члена.
См CWnd::OnDrawItem
. описание DRAWITEMSTRUCT
структуры.
Пример
Следующий код представлен в примере 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
Включает, отключает или отключает элемент меню.
UINT EnableMenuItem(
UINT nIDEnableItem,
UINT nEnable);
Параметры
nIDEnableItem
Указывает элемент меню, который необходимо включить, как определено nEnable
. Этот параметр может указывать всплывающие пункты меню, а также стандартные элементы меню.
nEnable
Указывает действие для выполнения. Это может быть сочетание MF_DISABLED
, MF_ENABLED
или MF_GRAYED
, с MF_BYCOMMAND
или MF_BYPOSITION
. Эти значения можно объединить с помощью побитового оператора OR C++ (|
). Данные величины имеют следующие значения:
MF_BYCOMMAND
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию.MF_BYPOSITION
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0.MF_DISABLED
Отключает элемент меню, чтобы его нельзя было выбрать, но не отключает его.MF_ENABLED
Включает элемент меню, чтобы его можно было выбрать и восстановить из его неактивного состояния.MF_GRAYED
Отключает элемент меню, чтобы его нельзя было выбрать, и отключает его.
Возвращаемое значение
Предыдущее состояние (MF_DISABLED
, MF_ENABLED
или ) или MF_GRAYED
-1, если недопустимо.
Замечания
Функции CreateMenu
,, LoadMenuIndirect
и InsertMenu
ModifyMenu
члены также могут задать состояние (включено, отключено или неактивно) элемента меню.
MF_BYPOSITION
Использование значения требует, чтобы приложение использовало правильное CMenu
значение. CMenu
Если используется строка меню, затрагивается элемент меню верхнего уровня (элемент в строке меню). Чтобы задать состояние элемента во всплывающем или вложенном всплывающем меню по позиции, приложение должно указать CMenu
всплывающее меню.
Если приложение указывает MF_BYCOMMAND
флаг, Windows проверяет все всплывающие пункты меню, подчиненные CMenu
; поэтому, если повторяющиеся элементы меню отсутствуют, использование CMenu
строки меню достаточно.
Пример
// 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
Возвращает указатель на CMenu
объект, заданный дескриптором Windows в меню.
static CMenu* PASCAL FromHandle(HMENU hMenu);
Параметры
hMenu
Дескриптор Windows в меню.
Возвращаемое значение
Указатель на объект, CMenu
который может быть временным или постоянным.
Замечания
CMenu
Если объект еще не присоединен к объекту меню Windows, создается временный и присоединенный CMenu
объект.
Этот временный объект действителен только до следующего момента, когда приложение имеет время простоя CMenu
в цикле событий, в течение которого удаляются все временные объекты.
Пример
Пример см. в примере CMenu::CreateMenu
.
CMenu::GetDefaultItem
Определяет элемент меню по умолчанию в указанном меню.
UINT GetDefaultItem(
UINT gmdiFlags,
BOOL fByPos = FALSE);
Параметры
gmdiFlags
Значение, указывающее, как функция выполняет поиск элементов меню. Этот параметр может иметь значение none, one или сочетание следующих значений:
Значение | Значение |
---|---|
GMDI_GOINTOPOPUPS |
Указывает, что если элемент по умолчанию является одним из открывающих подменю, функция — выполнять поиск в соответствующем подменю рекурсивно. Если подменю нет элемента по умолчанию, возвращаемое значение определяет элемент, открывающий подменю. По умолчанию функция возвращает первый элемент по умолчанию в указанном меню независимо от того, является ли он элементом, открывающим подменю. |
GMDI_USEDISABLED |
Указывает, что функция возвращает элемент по умолчанию, даже если он отключен. По умолчанию функция пропускает отключенные или серые элементы. |
fByPos
Значение, указывающее, следует ли получить идентификатор элемента меню или его положение. Если этот параметр имеет значение FALSE
, возвращается идентификатор. В противном случае возвращается позиция.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение является идентификатором или положением элемента меню. Если функция завершается ошибкой, возвращаемое значение равно 1.
Замечания
Эта функция-член реализует поведение функции GetMenuDefaultItem
Win32, как описано в пакете SDK для Windows.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::GetMenuContextHelpId
Извлекает идентификатор справки контекста, связанный с CMenu
.
DWORD GetMenuContextHelpId() const;
Возвращаемое значение
Идентификатор справки контекста, связанный с CMenu
данными, если он имеет один; в противном случае — ноль.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::GetMenuInfo
Извлекает сведения для меню.
BOOL GetMenuInfo(LPMENUINFO lpcmi) const;
Параметры
lpcmi
Указатель на MENUINFO
структуру, содержащую сведения для меню.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение ненулевое; в противном случае возвращаемое значение равно нулю.
Замечания
Вызовите эту функцию, чтобы получить сведения о меню.
CMenu::GetMenuItemCount
Определяет количество элементов во всплывающем меню или меню верхнего уровня.
UINT GetMenuItemCount() const;
Возвращаемое значение
Количество элементов в меню, если функция выполнена успешно; в противном случае - 1.
Пример
Пример см. в примере CWnd::GetMenu
.
CMenu::GetMenuItemID
Получает идентификатор элемента меню для элемента меню, расположенного по расположению, определенному .nPos
UINT GetMenuItemID(int nPos) const;
Параметры
nPos
Указывает позицию (отсчитываемую от нуля) элемента меню, идентификатор которого извлекается.
Возвращаемое значение
Идентификатор элемента для указанного элемента во всплывающем меню, если функция выполнена успешно. Если указанный элемент представляет собой всплывающее меню (в отличие от элемента в всплывающем меню), возвращаемое значение равно -1. Если nPos
соответствует элементу SEPARATOR
меню, возвращаемое значение равно 0.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::GetMenuItemInfo
Извлекает сведения о элементе меню.
BOOL GetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Параметры
uItem
Идентификатор или позиция элемента меню для получения сведений. Значение этого параметра зависит от значения ByPos
.
lpMenuItemInfo
Указатель на MENUITEMINFO
указатель на пакет SDK для Windows, содержащий сведения о меню.
fByPos
Значение, указывающее значение nIDItem
. По умолчанию это FALSE
означает, ByPos
что uItem является идентификатором элемента меню. Если ByPos
значение не задано FALSE
, оно указывает положение элемента меню.
Возвращаемое значение
Если функция выполняется успешно, возвращается ненулевое значение. Если функция выполняется неудачно, возвращается нулевое значение. Чтобы получить расширенные сведения об ошибке, используйте функцию GetLastError
Win32, как описано в пакете SDK для Windows.
Замечания
Эта функция-член реализует поведение функции GetMenuItemInfo
Win32, как описано в пакете SDK для Windows. Обратите внимание, что в реализации GetMenuItemInfo
MFC не используется дескриптор в меню.
Пример
// 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
Возвращает состояние указанного пункта меню или количество элементов во всплывающем меню.
UINT GetMenuState(
UINT nID,
UINT nFlags) const;
Параметры
nID
Указывает идентификатор элемента меню, как определено nFlags
.
nFlags
Указывает характер nID
. Может иметь одно из следующих значений.
MF_BYCOMMAND
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию.MF_BYPOSITION
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0.
Возвращаемое значение
Значение 0xFFFFFFFF
, если указанный элемент не существует. Если nId
идентифицирует всплывающее меню, байт высокого порядка содержит количество элементов во всплывающем меню, а байт с низким порядком содержит флаги меню, связанные с всплывающем меню. В противном случае возвращаемое значение представляет собой маску (логическое ИЛИ) значений из следующего списка (эта маска описывает состояние элемента меню, nId
определяющего):
MF_CHECKED
Выполняет роль переключателя для размещения флажка по умолчанию рядом сMF_UNCHECKED
элементом. Когда приложение предоставляет растровые изображения флажка (смSetMenuItemBitmaps
. функцию-член), отображается битовое изображение с флажками.MF_DISABLED
Отключает элемент меню, чтобы его нельзя было выбрать, но не отключает его.MF_ENABLED
Включает элемент меню, чтобы его можно было выбрать и восстановить из его неактивного состояния. Обратите внимание, что значение этой константы равно 0; Приложение не должно проверять значение 0 для сбоя при использовании этого значения.MF_GRAYED
Отключает элемент меню, чтобы его нельзя было выбрать, и отключает его.MF_MENUBARBREAK
Помещает элемент в новую строку в статических меню или в новом столбце во всплывающих меню. Новый столбец всплывающего меню будет отделен от старого столбца вертикальной линией деления.MF_MENUBREAK
Помещает элемент в новую строку в статических меню или в новом столбце во всплывающих меню. Ни один разделительный линии не помещается между столбцами.MF_SEPARATOR
Рисует горизонтальную линию деления. Можно использовать только во всплывающем меню. Эта строка не может быть отключена, отключена или выделена. Другие параметры игнорируются.MF_UNCHECKED
Выполняет функцию переключателя, чтобы удалить флажок рядом сMF_CHECKED
элементом. Когда приложение предоставляет растровые изображения флажка (смSetMenuItemBitmaps
. функцию-член), отображается битовое изображение с флажками. Обратите внимание, что значение этой константы равно 0; Приложение не должно проверять значение 0 для сбоя при использовании этого значения.
Пример
// 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
Копирует метку указанного элемента меню в указанный буфер.
int GetMenuString(
UINT nIDItem,
LPTSTR lpString,
int nMaxCount,
UINT nFlags) const;
int GetMenuString(
UINT nIDItem,
CString& rString,
UINT nFlags) const;
Параметры
nIDItem
Указывает целый идентификатор элемента меню или смещение элемента меню в меню в зависимости от значения nFlags
.
lpString
Указывает на буфер, который требуется получить метку.
rString
Ссылка на CString
объект, который требуется получить скопированную строку меню.
nMaxCount
Указывает максимальную длину (в символах) копируемых меток. Если метка длиннее максимального значения, то nMaxCount
дополнительные символы усечены.
nFlags
Указывает интерпретацию nIDItem
параметра. Может иметь одно из следующих значений.
nFlags |
Интерпретация nIDItem |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
Возвращаемое значение
Указывает фактическое количество символов, скопированных в буфер, не включая конечный элемент NULL.
Замечания
Параметр nMaxCount
должен быть больше числа символов в метке, чтобы вместить пустой символ, завершающий строку.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::GetSafeHmenu
Возвращает оболочку HMENU
этого CMenu
объекта или NULL
CMenu
указатель.
HMENU GetSafeHmenu() const;
Пример
Пример см. в примере CMenu::LoadMenu
.
CMenu::GetSubMenu
Извлекает CMenu
объект всплывающего меню.
CMenu* GetSubMenu(int nPos) const;
Параметры
nPos
Указывает положение всплывающего меню, содержащегося в меню. Значения позиции начинаются с 0 для первого элемента меню. Идентификатор всплывающего меню нельзя использовать в этой функции.
Возвращаемое значение
Указатель на CMenu
объект, член которого m_hMenu
содержит дескриптор всплывающего меню, если всплывающее меню существует в заданной позиции; в противном случае NULL
. CMenu
Если объект не существует, создается временная. Возвращаемый CMenu
указатель не должен храниться.
Пример
Пример см. в примере CMenu::TrackPopupMenu
.
CMenu::InsertMenu
Вставляет новый пункт меню в положение, указанное nPosition
и перемещает другие элементы в меню.
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);
Параметры
nPosition
Указывает элемент меню, перед которым нужно вставить новый элемент меню. Параметр nFlags
можно использовать для интерпретации nPosition
следующим образом:
nFlags |
Интерпретация nPosition |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. Если nPosition значение равно -1, новый пункт меню добавляется в конец меню. |
nFlags
Указывает, как nPosition
интерпретируется и указывает сведения о состоянии нового элемента меню при добавлении в меню. Список флагов, которые могут быть заданы, см. в AppendMenu
функции-члене. Чтобы указать несколько значений, используйте побитовый оператор OR для объединения их с флагом или MF_BYPOSITION
флагомMF_BYCOMMAND
.
nIDNewItem
Указывает идентификатор команды нового элемента меню или, если nFlags
задано MF_POPUP
значение, дескриптор меню (HMENU
) всплывающего меню. Параметр nIDNewItem
игнорируется (не требуется), если nFlags
задано значение MF_SEPARATOR
.
lpszNewItem
Указывает содержимое нового элемента меню. nFlags
можно использовать для интерпретации lpszNewItem
следующим образом:
nFlags |
Интерпретация lpszNewItem |
---|---|
MF_OWNERDRAW |
Содержит 32-разрядное значение, предоставленное приложением для поддержания дополнительных данных, связанных с элементом меню. Это 32-разрядное значение доступно приложению в itemData члене структуры, предоставленной WM_MEASUREITEM и WM_DRAWITEM сообщениями. Эти сообщения отправляются при первоначальном отображении или изменении элемента меню. |
MF_STRING |
Содержит длинный указатель на строку, завершаемую значением NULL. Это интерпретация по умолчанию. |
MF_SEPARATOR |
Параметр lpszNewItem игнорируется (не требуется). |
pBmp
Указывает на CBitmap
объект, который будет использоваться в качестве элемента меню.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Приложение может указать состояние элемента меню, задав значения в nFlags
.
Всякий раз, когда меню, размещенное в окне, изменяется (отображается ли окно), приложение должно вызываться CWnd::DrawMenuBar
.
При nIDNewItem
указании всплывающего меню она становится частью меню, в котором она вставляется. Если это меню уничтожено, то также будет уничтожено вставленное меню. Вставленное меню должно быть отсоединяться от CMenu
объекта, чтобы избежать конфликта.
Если активное дочернее окно интерфейса документа (MDI) развернуто, а приложение вставляет всплывающее меню в меню приложения MDI, вызывая эту функцию и указывая MF_BYPOSITION
флаг, меню вставляется одна позиция дальше слева, чем ожидалось. Это происходит потому, что меню управления активного дочернего окна MDI вставляется в первую позицию строки меню окна MDI. Чтобы правильно разместить меню, приложение должно добавить 1 в значение позиции, которое в противном случае будет использоваться. Приложение может использовать WM_MDIGETACTIVE
сообщение для определения того, развернуто ли активное дочернее окно.
Пример
// 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
Вставляет новый пункт меню в указанное положение в меню.
BOOL InsertMenuItem(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Параметры
uItem
См. описание uItem
в InsertMenuItem
пакете SDK для Windows.
lpMenuItemInfo
См. описание lpmii
в InsertMenuItem
пакете SDK для Windows.
fByPos
См. описание fByPosition
в InsertMenuItem
пакете SDK для Windows.
Замечания
Эта функция выполняет оболочку InsertMenuItem
, описанную в пакете SDK для Windows.
CMenu::LoadMenu
Загружает ресурс меню из исполняемого файла приложения и присоединяет его к объекту CMenu
.
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);
Параметры
lpszResourceName
Указывает на строку, завершающую значение NULL, содержащую имя ресурса меню для загрузки.
nIDResource
Указывает идентификатор меню для загрузки ресурса меню.
Возвращаемое значение
Ненулевое значение, если ресурс меню был загружен успешно; в противном случае — 0.
Замечания
Перед выходом приложение должно освободить системные ресурсы, связанные с меню, если меню не назначено окну. Приложение освобождает меню, вызывая DestroyMenu
функцию-член.
Пример
// 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
Загружает ресурс из шаблона меню в памяти и присоединяет его к объекту CMenu
.
BOOL LoadMenuIndirect(const void* lpMenuTemplate);
Параметры
lpMenuTemplate
Указывает на шаблон меню (которая является одной MENUITEMTEMPLATEHEADER
структурой и коллекцией одной или нескольких MENUITEMTEMPLATE
структур). Дополнительные сведения об этих двух структурах см. в пакете SDK для Windows.
Возвращаемое значение
Ненулевое значение, если ресурс меню был загружен успешно; в противном случае — 0.
Замечания
Шаблон меню — это заголовок, за которым следует коллекция одной или нескольких MENUITEMTEMPLATE
структур, каждая из которых может содержать один или несколько элементов меню и всплывающие меню.
Номер версии должен быть 0.
Флаги mtOption
должны содержаться MF_END
для последнего элемента во всплывающем списке и для последнего элемента в основном списке. См. функцию-член AppendMenu
для других флагов. Элемент mtId
должен быть опущен из MENUITEMTEMPLATE
структуры при MF_POPUP
указании в mtOption
.
Пространство, выделенное для MENUITEMTEMPLATE
структуры, должно быть достаточно большим, чтобы mtString
содержать имя элемента меню в виде строки, завершаемой значением NULL.
Перед выходом приложение должно освободить системные ресурсы, связанные с меню, если меню не назначено окну. Приложение освобождает меню, вызывая DestroyMenu
функцию-член.
Пример
// 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
Задает дескриптор HMENU
меню Windows, присоединенного к объекту CMenu
.
HMENU m_hMenu;
Пример
Пример см. в примере CMenu::LoadMenu
.
CMenu::MeasureItem
Вызывается платформой при создании меню с стилем рисования владельца.
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
Параметры
lpMeasureItemStruct
Указатель на структуру MEASUREITEMSTRUCT
.
Замечания
По умолчанию эта функция-член ничего не делает. Переопределите эту функцию-член и заполните структуру MEASUREITEMSTRUCT
, чтобы сообщить Windows о измерениях меню.
См CWnd::OnMeasureItem
. описание MEASUREITEMSTRUCT
структуры.
Пример
Следующий код представлен в примере 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
Изменяет существующий пункт меню в позиции, указанной в параметре 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);
Параметры
nPosition
Указывает элемент меню, который необходимо изменить. Параметр nFlags
можно использовать для интерпретации nPosition
следующим образом:
nFlags |
Интерпретация nPosition |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
nFlags
Указывает, как nPosition
интерпретируется и предоставляет сведения об изменениях, внесенных в элемент меню. Список флагов, которые могут быть заданы, см. в AppendMenu
функции-члене.
nIDNewItem
Указывает идентификатор команды измененного элемента меню или, если nFlags
задано MF_POPUP
значение , дескриптор меню (HMENU
) всплывающего меню. Параметр nIDNewItem
игнорируется (не требуется), если nFlags
задано значение MF_SEPARATOR
.
lpszNewItem
Указывает содержимое нового элемента меню. Параметр nFlags
можно использовать для интерпретации lpszNewItem
следующим образом:
nFlags |
Интерпретация lpszNewItem |
---|---|
MF_OWNERDRAW |
Содержит 32-разрядное значение, предоставленное приложением для поддержания дополнительных данных, связанных с элементом меню. Это 32-разрядное значение доступно приложению при его обработке MF_MEASUREITEM и MF_DRAWITEM . |
MF_STRING |
Содержит длинный указатель на строку, завершаемую значением NULL, или на CString строку. |
MF_SEPARATOR |
Параметр lpszNewItem игнорируется (не требуется). |
pBmp
Указывает на CBitmap
объект, который будет использоваться в качестве элемента меню.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Приложение задает новое состояние элемента меню, задав значения в nFlags
. Если эта функция заменяет всплывающее меню, связанное с элементом меню, оно уничтожает старое всплывающее меню и освобождает память, используемую всплывающей меню.
При nIDNewItem
указании всплывающего меню она становится частью меню, в котором она вставляется. Если это меню уничтожено, то также будет уничтожено вставленное меню. Вставленное меню должно быть отсоединяться от CMenu
объекта, чтобы избежать конфликта.
Всякий раз, когда меню, размещенное в окне, изменяется (отображается ли окно), приложение должно вызываться CWnd::DrawMenuBar
. Чтобы изменить атрибуты существующих элементов меню, гораздо быстрее использовать CheckMenuItem
функции-члены и EnableMenuItem
функции-члены.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::operator HMENU
Используйте этот оператор для получения дескриптора CMenu
объекта.
operator HMENU() const;
Возвращаемое значение
В случае успешного выполнения дескриптор CMenu
объекта; в противном случае NULL
.
Замечания
Вы можете использовать дескриптор для вызова API Windows напрямую.
CMenu::operator !=
Определяет, являются ли два меню логически не равными.
BOOL operator!=(const CMenu& menu) const;
Параметры
menu
Объект CMenu
для сравнения.
Замечания
Проверяет, не равен ли объект меню на левой стороне объекту меню справа.
CMenu::operator ==
Определяет, равны ли два меню логически.
BOOL operator==(const CMenu& menu) const;
Параметры
menu
Объект CMenu
для сравнения.
Замечания
Проверяет, равен ли объект меню слева (с точки HMENU
зрения значения) объекту меню справа.
CMenu::RemoveMenu
Удаляет элемент меню со связанным всплывающем меню из меню.
BOOL RemoveMenu(
UINT nPosition,
UINT nFlags);
Параметры
nPosition
Указывает элемент меню, который нужно удалить. Параметр nFlags
можно использовать для интерпретации nPosition
следующим образом:
nFlags |
Интерпретация nPosition |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
nFlags
Указывает, как nPosition
интерпретируется.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Он не уничтожает дескриптор всплывающего меню, поэтому его можно использовать повторно. Перед вызовом этой функции приложение может вызвать GetSubMenu
функцию-член CMenu
, чтобы получить всплывающий объект для повторного использования.
Всякий раз, когда меню, которое находится в окне (отображается ли окно), приложение должно вызываться CWnd::DrawMenuBar
.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::SetDefaultItem
Задает элемент меню по умолчанию для указанного меню.
BOOL SetDefaultItem(
UINT uItem,
BOOL fByPos = FALSE);
Параметры
uItem
Идентификатор или позиция нового элемента меню по умолчанию или — 1 для элемента по умолчанию. Значение этого параметра зависит от значения fByPos
.
fByPos
Значение, указывающее значение uItem
. Если этот параметр имеет значение FALSE
, uItem
является идентификатором элемента меню. В противном случае это положение элемента меню.
Возвращаемое значение
Если функция выполняется успешно, возвращается ненулевое значение. Если функция выполняется неудачно, возвращается нулевое значение. Чтобы получить расширенные сведения об ошибке, используйте функцию GetLastError
Win32, как описано в пакете SDK для Windows.
Замечания
Эта функция-член реализует поведение функции SetMenuDefaultItem
Win32, как описано в пакете SDK для Windows.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::SetMenuContextHelpId
Связывает идентификатор справки контекста с CMenu
.
BOOL SetMenuContextHelpId(DWORD dwContextHelpId);
Параметры
dwContextHelpId
Идентификатор справки контекста для связывания.CMenu
Возвращаемое значение
Ненулевое значение при успешном выполнении; в противном случае — 0
Замечания
Все элементы в меню делятся этим идентификатором— невозможно подключить идентификатор контекста справки к отдельным элементам меню.
Пример
Пример см. в примере CMenu::InsertMenu
.
CMenu::SetMenuInfo
Задает сведения для меню.
BOOL SetMenuInfo(LPCMENUINFO lpcmi);
Параметры
lpcmi
Указатель на MENUINFO
структуру, содержащую сведения для меню.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение ненулевое; в противном случае возвращаемое значение равно нулю.
Замечания
Вызовите эту функцию, чтобы задать определенные сведения о меню.
CMenu::SetMenuItemBitmaps
Связывает указанные растровые изображения с элементом меню.
BOOL SetMenuItemBitmaps(
UINT nPosition,
UINT nFlags,
const CBitmap* pBmpUnchecked,
const CBitmap* pBmpChecked);
Параметры
nPosition
Указывает элемент меню, который необходимо изменить. Параметр nFlags
можно использовать для интерпретации nPosition
следующим образом:
nFlags |
Интерпретация nPosition |
---|---|
MF_BYCOMMAND |
Указывает, что параметр предоставляет идентификатор команды существующего элемента меню. Это значение по умолчанию, если ни MF_BYCOMMAND MF_BYPOSITION не задано. |
MF_BYPOSITION |
Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0. |
nFlags
Указывает, как nPosition
интерпретируется.
pBmpUnchecked
Указывает растровое изображение, используемое для элементов меню, которые не проверяются.
pBmpChecked
Указывает растровое изображение, используемое для проверяемых элементов меню.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Указывает, установлен ли элемент меню или снят, Windows отображает соответствующую растровую карту рядом с элементом меню.
Если это pBmpUnchecked
или pBmpChecked
есть NULL
, Windows не отображает ничего рядом с элементом меню соответствующего атрибута. Если оба параметра являются NULL
, Windows использует флажок по умолчанию при проверке элемента и удаляет флажок при снятии элемента.
При уничтожении меню эти растровые изображения не уничтожаются; приложение должно уничтожить их.
Функция Windows GetMenuCheckMarkDimensions
извлекает измерения флажка по умолчанию, используемого для элементов меню. Приложение использует эти значения для определения соответствующего размера растровых изображений, предоставленных этой функцией. Получите размер, создайте растровые изображения и задайте их.
Пример
// 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
Изменяет сведения о элементе меню.
BOOL SetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
Параметры
uItem
См. описание uItem
в SetMenuItemInfo
пакете SDK для Windows.
lpMenuItemInfo
См. описание lpmii
в SetMenuItemInfo
пакете SDK для Windows.
fByPos
См. описание fByPosition
в SetMenuItemInfo
пакете SDK для Windows.
Замечания
Эта функция выполняет оболочку SetMenuItemInfo
, описанную в пакете SDK для Windows.
CMenu::TrackPopupMenu
Отображает всплывающее меню с плавающей запятой в указанном расположении и отслеживает выбор элементов во всплывающем меню.
BOOL TrackPopupMenu(
UINT nFlags,
int x,
int y,
CWnd* pWnd,
LPCRECT lpRect = 0);
Параметры
nFlags
Задает флаги положения экрана и положения мыши. Список доступных флагов см. в списке TrackPopupMenu
.
x
Указывает горизонтальную позицию в координатах экрана всплывающего меню. В зависимости от значения nFlags
параметра меню может быть выровнено по левому краю, выровнено по правому краю или по центру относительно этой позиции.
y
Указывает вертикальную позицию в координатах экрана в верхней части меню на экране.
pWnd
Определяет окно, которое принадлежит всплывающему меню. Этот параметр не может быть NULL
, даже если TPM_NONOTIFY
флаг указан. Это окно получает все WM_COMMAND
сообщения из меню. В Windows версии 3.1 и более поздних версиях окно не получает WM_COMMAND
сообщения, пока TrackPopupMenu
не возвращается. В Windows 3.0 окно получает WM_COMMAND
сообщения перед TrackPopupMenu
возвратом.
lpRect
Пропускается.
Возвращаемое значение
Этот метод возвращает результат вызова TrackPopupMenu
в пакете SDK для Windows.
Замечания
Всплывающее меню с плавающей запятой может отображаться в любом месте экрана.
Пример
// 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
Отображает всплывающее меню с плавающей запятой в указанном расположении и отслеживает выбор элементов во всплывающем меню.
BOOL TrackPopupMenuEx(
UINT fuFlags,
int x,
int y,
CWnd* pWnd,
LPTPMPARAMS lptpm);
Параметры
fuFlags
Задает различные функции для расширенного меню. Список всех значений и их значения см. в разделе TrackPopupMenuEx
.
x
Указывает горизонтальную позицию в координатах экрана всплывающего меню.
y
Указывает вертикальную позицию в координатах экрана в верхней части меню на экране.
pWnd
Указатель на окно с всплывющим меню и получение сообщений из созданного меню. Это окно может быть любым окном из текущего приложения, но не может быть NULL
. Если указан TPM_NONOTIFY
параметр fuFlags
, функция не отправляет сообщения pWnd
в . Функция должна вернуться для окна, на которое указывает pWnd
WM_COMMAND
сообщение.
lptpm
Указатель на TPMPARAMS
структуру, указывающую область экрана, меню не должно перекрываться. Этот параметр может иметь значение NULL
.
Возвращаемое значение
При указании TPM_RETURNCMD
в параметре fuFlags
возвращаемое значение является идентификатором элемента меню, выбранного пользователем. Если пользователь отменяет меню без выделения или если возникает ошибка, возвращаемое значение равно 0.
Если в параметре не указано TPM_RETURNCMD
fuFlags
, возвращаемое значение ненулевое, если функция завершается успешно и 0, если она завершается ошибкой. Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError
.
Замечания
Всплывающее меню с плавающей запятой может отображаться в любом месте экрана. Дополнительные сведения об обработке ошибок при создании всплывающего меню см. в статье TrackPopupMenuEx
.
См. также
Пример MFC CTRLTEST
Пример MFC DYNAMENU
CObject
Класс
Диаграмма иерархии