Класс CMenu

Инкапсуляция HMENUWindows.

Синтаксис

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 , проще поддерживать, и сам ресурс меню можно создать и изменить в редакторе меню.

Иерархия наследования

CObject

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_OWNERDRAWMF_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_BYCOMMANDMF_BYPOSITION не задано.
MF_BYPOSITION Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0.

Возвращаемое значение

Ненулевое значение при успешном выполнении; в противном случае — 0

Замечания

В то же время функция un проверка всех остальных элементов меню в связанной группе и очищает флаг типа радио-элемента для этих элементов. Элемент проверка отображается с помощью растровой кнопки (или маркера) вместо проверка пометки растрового изображения.

Пример

Пример см. в примере 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_BYCOMMANDMF_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 структуру, содержащую сведения о типе документа.

Замечания

Элемент itemActionDRAWITEMSTRUCT структуры определяет действие рисования, которое необходимо выполнить. Переопределите эту функцию-член, чтобы реализовать рисование для объекта 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 и InsertMenuModifyMenuчлены также могут задать состояние (включено, отключено или неактивно) элемента меню.

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.

Замечания

Эта функция-член реализует поведение функции GetMenuDefaultItemWin32, как описано в пакете 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, оно указывает положение элемента меню.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение. Если функция выполняется неудачно, возвращается нулевое значение. Чтобы получить расширенные сведения об ошибке, используйте функцию GetLastErrorWin32, как описано в пакете SDK для Windows.

Замечания

Эта функция-член реализует поведение функции GetMenuItemInfoWin32, как описано в пакете SDK для Windows. Обратите внимание, что в реализации GetMenuItemInfoMFC не используется дескриптор в меню.

Пример

// 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_BYCOMMANDMF_BYPOSITION не задано.
MF_BYPOSITION Указывает, что параметр предоставляет положение существующего элемента меню. Первый элемент находится в позиции 0.

Возвращаемое значение

Указывает фактическое количество символов, скопированных в буфер, не включая конечный элемент NULL.

Замечания

Параметр nMaxCount должен быть больше числа символов в метке, чтобы вместить пустой символ, завершающий строку.

Пример

Пример см. в примере CMenu::InsertMenu.

CMenu::GetSafeHmenu

Возвращает оболочку HMENU этого CMenu объекта или NULLCMenu указатель.

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_BYCOMMANDMF_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_BYCOMMANDMF_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_BYCOMMANDMF_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 является идентификатором элемента меню. В противном случае это положение элемента меню.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение. Если функция выполняется неудачно, возвращается нулевое значение. Чтобы получить расширенные сведения об ошибке, используйте функцию GetLastErrorWin32, как описано в пакете SDK для Windows.

Замечания

Эта функция-член реализует поведение функции SetMenuDefaultItemWin32, как описано в пакете 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_BYCOMMANDMF_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в . Функция должна вернуться для окна, на которое указывает pWndWM_COMMAND сообщение.

lptpm
Указатель на TPMPARAMS структуру, указывающую область экрана, меню не должно перекрываться. Этот параметр может иметь значение NULL.

Возвращаемое значение

При указании TPM_RETURNCMD в параметре fuFlags возвращаемое значение является идентификатором элемента меню, выбранного пользователем. Если пользователь отменяет меню без выделения или если возникает ошибка, возвращаемое значение равно 0.

Если в параметре не указано TPM_RETURNCMDfuFlags , возвращаемое значение ненулевое, если функция завершается успешно и 0, если она завершается ошибкой. Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError.

Замечания

Всплывающее меню с плавающей запятой может отображаться в любом месте экрана. Дополнительные сведения об обработке ошибок при создании всплывающего меню см. в статье TrackPopupMenuEx.

См. также

Пример MFC CTRLTEST
Пример MFC DYNAMENU
CObject Класса
Диаграмма иерархии