Поделиться через


О меню

Меню — это список элементов, определяющих параметры или группы параметров (подменю) для приложения. При щелчке элемента меню открывается подменю или приложение выполняет команду. В этом разделе содержатся сведения о следующих разделах:

Меню упорядочено в иерархии. На верхнем уровне иерархии находится строка меню, которая содержит список меню, которые, в свою очередь, могут содержать подменю. Строка меню иногда называется меню верхнего уровня, а меню и подменю также известны как всплывающие меню.

Элемент меню может выполнить команду или открыть подменю. Элемент, который выполняет команду, называется командным элементом или командой .

Элемент в строке меню почти всегда открывает меню. В строках меню редко содержатся элементы команды. Меню, открытое из строки меню, выпадает из строки меню и иногда называется раскрывающимся меню . При отображении раскрывающегося меню он присоединяется к строке меню. Элемент меню в строке меню, открывающий раскрывающееся меню, также называется именем меню.

Имена меню в строке меню представляют основные категории команд, которые предоставляет приложение. Выбор имени меню в строке меню обычно открывает меню, элементы меню которого соответствуют командам в категории. Например, строка меню может содержать имя меню файла, которое при щелчке пользователя активирует меню с такими элементами меню, как Создать, Открытьи Сохранить. Чтобы получить сведения о строке меню, вызовите GetMenuBarInfo.

Только в перекрывающемся или всплывающем окне может быть строка меню; дочернее окно не может её содержать. Если в окне есть строка заголовка, система размещает строку меню прямо под ней. Строка меню всегда отображается. Однако подменю не отображается, пока пользователь не выберет элемент меню, который активирует его. Дополнительные сведения о перекрывающихся и всплывающих окнах см. в разделе Типы окон.

Каждое меню должно иметь окно владельца. Система отправляет сообщения в окно владельца меню, когда пользователь выбирает меню или выбирает элемент из меню.

В этом разделе рассматриваются следующие разделы.

Контекстные меню

Система также предоставляет контекстные меню . Контекстное меню не присоединено к строке меню; он может отображаться в любом месте экрана. Приложение обычно связывает контекстное меню с частью окна, например клиентской областью или определенным объектом, например значком. По этой причине эти меню также называются контекстные меню.

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

Меню окна

Меню окна (также известное как меню системы или меню управления) — это всплывающее меню, определенное и управляемое практически исключительно операционной системой. Пользователь может открыть меню окна, щелкнув значок приложения в строке заголовка или щелкнув правой кнопкой мыши в строке заголовка.

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

Когда пользователь выбирает команду из меню окна, система отправляет WM_SYSCOMMAND сообщение в окно владельца меню. В большинстве приложений процедура окна не обрабатывает сообщения из меню окна. Вместо этого он просто передает сообщения в функцию DefWindowProc для обработки сообщения по умолчанию системы. Если приложение добавляет команду в меню окна, процедура окна должна обработать команду.

Приложение может использовать функцию GetSystemMenuдля создания копии меню окна по умолчанию для изменения. Любое окно, не использующее функцию GetSystemMenu для создания собственной копии меню окна, получает стандартное меню окна.

Идентификатор помощи

С каждой панелью меню, меню, подменю и контекстным меню связан идентификатор справки. Если пользователь нажимает клавишу F1 во время активности меню, это значение отправляется в окно владельца в рамках сообщения WM_HELP.

Доступ к меню с помощью клавиатуры

Система предоставляет стандартный интерфейс клавиатуры для меню. Этот интерфейс можно улучшить, предоставив мнемонические клавиши доступа и горячие клавиши для элементов меню.

В следующих разделах описан стандартный интерфейс клавиатуры, клавиши доступа и сочетания клавиш:

Стандартный интерфейс клавиатуры

Система предназначена для работы с мышью или без другого указателя устройства. Так как система предоставляет стандартный интерфейс клавиатуры, пользователь может использовать клавиатуру для выбора элементов меню. Этот интерфейс клавиатуры не требует специального кода. Приложение получает командное сообщение, выбирает ли пользователь пункт меню с помощью клавиатуры или с помощью мыши. Стандартный интерфейс клавиатуры обрабатывает следующие нажатия клавиш.

Нажатие клавиши Действие
Алфавитный символ Выбирает первый пункт меню с указанным символом в качестве ключа доступа. Если выбранный элемент вызывает меню, отображается меню и выделен первый элемент. В противном случае выбран элемент меню.
Альт Переключает в режим строки меню и обратно.
ALT+ПРОБЕЛ Отображает меню окна.
ВХОДИТЬ Активирует меню и выбирает первый пункт, если элемент имеет связанное с ним меню. В противном случае это нажатие клавиши выбирает элемент так, как если бы пользователь отпустил кнопку мыши в момент выбора элемента.
ESC Завершает режим меню.
СТРЕЛКА ВЛЕВО Переходит к предыдущему пункту меню верхнего уровня. Элементы меню верхнего уровня включают имена меню и меню окна. Если выбранный элемент находится в меню, выбран предыдущий столбец в меню или выбран предыдущий элемент меню верхнего уровня.
СТРЕЛКА ВПРАВО Работает как клавиша СТРЕЛКА ВЛЕВО, только в противоположном направлении. В меню это нажатие клавиши перемещается вперед по одному столбцу; если выбранный элемент находится в правом крайнем столбце, то выбрано следующее меню.
СТРЕЛКИ ВВЕРХ ИЛИ ВНИЗ Активирует меню при нажатии на имя меню. При нажатии клавиши СТРЕЛКА ВВЕРХ в меню выбирается предыдущий элемент, а нажатие клавиши СТРЕЛКА ВНИЗ выбирает следующий элемент.

 

Стандартный интерфейс клавиатуры для меню можно расширить, добавив клавиши доступа (mnemonics) в пункты меню. Ключ доступа — это подчеркнутая буква в тексте элемента меню. Если меню активно, пользователь может выбрать пункт меню, нажав клавишу, соответствующую подчеркиваемой букве элемента. Пользователь активирует строку меню, нажав клавишу ALT, чтобы выделить первый элемент на строке меню. Меню является активным, когда его отображают.

Чтобы создать ключ доступа для элемента меню, поставьте перед любым символом текста элемента знаком амперсанд. Например, текстовая строка "&Move" приводит к тому, что система подчеркивает букву "M".

Помимо наличия ключа доступа, элемент меню может иметь ярлык ключа, связанный с ним. Сочетание клавиш отличается от ключа доступа, так как меню не должно быть активным для работы сочетания клавиш. Кроме того, ключ доступа всегда связан с элементом меню, а сочетание клавиш обычно (но не обязательно) связано с элементом меню.

Текст, определяющий сочетание клавиш, добавляется в текстовую строку элемента меню. Контекстный текст отображается справа от имени элемента меню после обратной косой черты и символа табуляции (\t). Например, "&Close\tAlt+F4" представляет команду Close с сочетанием клавиш ALT+F4 в качестве сочетания клавиш и буквы "C" в качестве ключа доступа. Дополнительные сведения см. в разделе Ускорители клавиатуры.

Можно создать меню с помощью шаблона меню или функций создания меню. Шаблоны меню обычно определяются как ресурсы. Ресурсы шаблонов меню можно загрузить явным образом или назначить в качестве меню по умолчанию для класса окна. Вы также можете динамически создавать ресурсы шаблонов меню в памяти.

В следующих разделах подробно описано создание меню:

Большинство приложений создают меню с помощью ресурсов шаблона меню. Шаблон меню определяет меню, включая элементы в строке меню и все меню. Сведения о создании ресурса шаблона меню см. в документации, прилагаемой к средствам разработки.

После создания ресурса шаблона меню и добавления его в исполняемый файл приложения (.exe) можно использовать функцию LoadMenu для загрузки ресурса в память. Эта функция возвращает дескриптор меню, который затем можно назначить окну с помощью функции SetMenu. Меню можно назначить любому окну, которое не является дочерним окном.

Реализация меню в качестве ресурсов упрощает локализацию приложения для использования в нескольких странах или регионах. Для каждого языка необходимо локализовать только файл определения ресурсов, а не исходный код приложения.

Меню можно создать из шаблона меню, встроенного в память во время выполнения. Например, приложение, позволяющее пользователю настраивать его меню, может создать шаблон меню в памяти на основе предпочтений пользователя. Затем приложение может сохранить шаблон в файле или реестре для дальнейшего использования. Чтобы создать меню из шаблона в памяти, используйте функцию LoadMenuIndirect. Описание форматов шаблонов меню см. в разделе Ресурсы шаблонов меню.

Стандартный шаблон меню состоит из структуры MENUITEMTEMPLATEHEADER, за которой следует одна или несколько структур MENUITEMTEMPLATE.

Шаблон расширенного меню состоит из структуры MENUEX_TEMPLATE_HEADER, за которой следует одна или несколько MENUEX_TEMPLATE_ITEM структур.

Система создает уникальный идентификатор для каждого меню. Дескриптор меню — это значение типа HMENU. Приложение должно указать дескриптор меню во многих функциях меню. Вы получаете дескриптор строки меню при создании меню или загрузке ресурса меню.

Чтобы получить дескриптор на строку меню для созданного или загруженного меню, используйте функцию GetMenu. Чтобы получить дескриптор подменю, связанного с элементом меню, используйте функцию GetSubMenu или GetMenuItemInfo. Чтобы получить дескриптор меню окна, используйте функцию GetSystemMenu.

С помощью функций создания меню можно создавать меню во время выполнения или добавлять элементы меню в существующие меню. Вы можете использовать функцию CreateMenu для создания пустой строки меню и функцию CreatePopupMenu для создания пустого меню. Вы можете сохранить определенные параметры для меню с помощью структуры MENUINFO. Чтобы получить или извлечь параметры меню, используйте GetMenuInfo или SetMenuInfo. Чтобы добавить элементы в меню, используйте функцию InsertMenuItem. Старые функции AppendMenu и InsertMenu по-прежнему поддерживаются, но InsertMenuItem следует использовать для новых приложений.

После загрузки или создания меню оно должно быть назначено окну, прежде чем система сможет отобразить ее. Вы можете назначить меню, определив меню класса. Дополнительные сведения см. в меню классов окон. Вы также можете назначить меню окну, указав дескриптор в качестве параметра hMenuфункции CreateWindow или CreateWindowEx или вызвав функцию SetMenu.

Чтобы отобразить контекстное меню, используйте функцию TrackPopupMenuEx. Контекстные меню, также называемые всплывающими меню или контекстными меню, обычно отображаются при обработке сообщения WM_CONTEXTMENU.

Меню можно назначить любому окну, которое не является дочерним окном.

Старая функция TrackPopupMenu по-прежнему поддерживается, но новые приложения должны использовать функцию TrackPopupMenuEx.

Меню классов окон

Можно указать меню по умолчанию, называемое меню класса , при регистрации класса окна. Для этого назначьте имя ресурса шаблона меню lpszMenuName члена структуры WNDCLASS, используемой для регистрации класса.

По умолчанию каждое окно назначается меню класса для своего класса окна, поэтому не нужно явно загружать меню и назначать его каждому окну. Можно переопределить меню класса, указав другой дескриптор меню в вызове функции CreateWindowEx. Вы также можете изменить меню окна после его создания с помощью функции SetMenu. Дополнительные сведения см. в разделе классы окон.

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

Командные элементы и элементы, открывающие подменю

Когда пользователь выбирает элемент команды, система отправляет командное сообщение в окно, которое владеет меню. Если элемент команды находится в меню окна, система отправляет сообщение WM_SYSCOMMAND. В противном случае он отправляет сообщение WM_COMMAND.

Каждому элементу меню, который открывает подменю, соответствует дескриптор этого подменю. Когда пользователь указывает на такой элемент, система открывает подменю. Командное сообщение не отправляется в окно владельца. Однако система отправляет WM_INITMENUPOPUP сообщение в окно владельца перед отображением подменю. Вы можете получить дескриптор подменю, связанного с элементом, с помощью функции GetSubMenu или GetMenuItemInfo.

Строка меню обычно содержит имена меню, но также может содержать элементы команд. Подменю обычно содержит элементы команд, но также может содержать элементы, которые открывают вложенные подменю. Добавив такие элементы в подменю, вы можете вложить меню в любую глубину. Для предоставления визуального подсказки для пользователя система автоматически отображает небольшую стрелку справа от текста элемента меню, открывающего подменю.

С каждым элементом меню связано уникальное целое число, определяемое приложением, которое называется идентификатор элемента меню. Когда пользователь выбирает элемент команды из меню, система отправляет идентификатор элемента в окно владельца в рамках сообщения WM_COMMAND. Процедура окна проверяет идентификатор для определения источника сообщения и обрабатывает сообщение соответствующим образом. Кроме того, можно указать элемент меню с помощью его идентификатора при вызове функций меню; Например, чтобы включить или отключить элемент меню.

Элементы меню, которые открывают подменю, имеют идентификаторы так же, как и команды. Однако система не отправляет командное сообщение при выборе такого элемента в меню. Вместо этого система открывает подменю, связанную с элементом меню.

Чтобы получить идентификатор элемента меню в указанной позиции, используйте функцию GetMenuItemID или GetMenuItemInfo.

Помимо уникального идентификатора, каждый элемент меню в строке меню или меню имеет уникальное значение позиции. Самый левый элемент в строке меню или верхний элемент в меню имеет нулевое положение. Значение позиции увеличивается для последующих элементов меню. Система назначает значение позиции всем элементам в меню, включая разделители. На следующем рисунке показаны значения позиции элементов в строке меню и в меню.

строка меню и меню

При вызове функции меню, которая изменяет или извлекает сведения о определенном элементе меню, можно указать элемент с помощью идентификатора или его позиции. Дополнительные сведения см. в следующем разделе.

Доступ к элементам меню программным способом

Большинство функций меню позволяют указать пункт меню по позиции или по команде. Некоторые функции используют флаги MF_BYPOSITION и MF_BYCOMMAND для указания алгоритма поиска; другие имеют явный параметр fByPosition. Если указать элемент меню по позиции, номер элемента является отсчитываемым от нуля индексом в меню. Если указать пункт меню по командам, меню и его подменю будут искать элемент, идентификатор меню которого равен указанному номеру элемента. Если несколько элементов в иерархии меню совпадают с номером элемента, оно не указано, какое из них используется. Если в меню содержатся повторяющиеся идентификаторы меню, следует использовать операции меню на основе позиции, чтобы избежать этой неоднозначности.

Элементы меню по умолчанию

Подменю может содержать один элемент меню по умолчанию. Когда пользователь открывает подменю, дважды щелкнув его, система отправляет сообщение команды в окно владельца меню и закрывает меню, как если бы выбран элемент команды по умолчанию. Если элемент команды по умолчанию отсутствует, подменю остается открытым. Чтобы получить и задать элемент по умолчанию для подменю, используйте функции GetMenuDefaultItem и SetMenuDefaultItem.

Выбранные и очищенные пункты меню

Элемент меню можно выбрать или очистить. Система отображает растровое изображение рядом с выбранными элементами меню, чтобы указать их выбранное состояние. Система не отображает растровое изображение рядом с очищаемыми элементами, если не указана определяемая приложением растровая карта. Можно выбрать только элементы меню в меню; Элементы в строке меню не могут быть выбраны.

Приложения обычно проверяют или очищают пункт меню, чтобы указать, действует ли параметр. Например, предположим, что у приложения есть панель инструментов, которую пользователь может показать или скрыть с помощью команды панели инструментов в меню. Когда панель инструментов скрыта, пункт меню Toolbar становится очевидным. Когда пользователь выбирает команду, приложение проверяет элемент меню и отображает панель инструментов.

Атрибут флажка определяет, выбран ли элемент меню. Атрибут флажка элемента меню можно задать с помощью функции CheckMenuItem. Вы можете использовать функцию GetMenuState, чтобы определить, выбран ли элемент меню в данный момент или снят.

Вместо CheckMenuItem и GetMenuStateможно использовать функции GetMenuItemInfo и SetMenuItemInfo для получения и задания состояния отметки элемента меню.

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

По умолчанию система отображает флажок или точечный рисунок маркера рядом с выбранными элементами меню и без растрового изображения рядом с очищаемыми элементами меню. Однако можно использовать функцию SetMenuItemBitmaps, чтобы связать пользовательские растровые изображения для выбранных и очищенных элементов с элементом меню. Затем система использует указанные растровые изображения, чтобы указать выбранное или снятое состояние элемента меню.

Определяемые приложением растровые изображения, связанные с элементом меню, должны иметь тот же размер, что и растровое изображение флажка по умолчанию, размеры которых могут отличаться в зависимости от разрешения экрана. Чтобы получить правильные измерения, используйте функцию GetSystemMetrics. Можно создать несколько ресурсов растрового изображения для разных разрешений экрана; при необходимости создайте один ресурс растрового изображения и масштабируйте его; или создайте растровое изображение во время выполнения и нарисуйте в нем изображение. Растровые изображения могут быть монохромными или цветными. Тем не менее, поскольку элементы меню перевернуты при выделении, некоторым растровым изображениям с инвертированными цветами может быть придан нежелательный внешний вид. Дополнительные сведения см. в растровых рисунках.

Включенные, серые и отключенные элементы меню

Элемент меню может быть включен, серый или отключен. По умолчанию элемент меню включен. Когда пользователь выбирает включенный пункт меню, система отправляет командное сообщение в окно владельца или отображает соответствующий подменю в зависимости от типа элемента меню.

Если элементы меню недоступны пользователю, они должны быть серыми или отключены. Не удается выбрать серые и отключенные элементы меню. Отключенный элемент выглядит так же, как и включенный элемент. Когда пользователь щелкает отключенный элемент, элемент не выбран, и ничего не происходит. Отключенные элементы могут быть полезны, например, в руководстве, представляющем меню, которое выглядит активным, но не является.

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

Функция EnableMenuItemвключает, делает неактивным или отключает элемент меню. Чтобы определить, включен ли элемент меню, серый или отключен, используйте функцию GetMenuItemInfo.

Вместо GetMenuItemInfoможно также использовать функцию GetMenuState, чтобы определить, включен ли элемент меню, серый или отключен.

Выделенные пункты меню

Система автоматически выделяет элементы меню в меню, так как пользователь выбирает их. Однако выделение можно явно добавить или удалить из имени меню в строке меню с помощью функции HiliteMenuItem. Эта функция не влияет на элементы меню в меню. Если HiliteMenuItem используется для выделения имени меню, то имя только кажется выбранным, но на самом деле не выделяется. Если пользователь нажимает клавишу ВВОД, выделенный элемент не выбран. Эта функция может оказаться полезной, например, в обучающем приложении, демонстрирующем использование меню.

Owner-Drawn Пункты меню

Приложение может полностью контролировать внешний вид элемента меню с помощью элемента с собственным отображением. Элементы, нарисованные владельцем, требуют от приложения общей ответственности за рисование выбранных (выделенных), выбранных и очищенных состояний. Например, если приложение предоставило меню выбора шрифта, оно может отображать каждый пункт меню с использованием соответствующего шрифта; элемент для шрифта Roman будет отображен шрифтом roman, элемент для italic будет отображен курсивом и так далее. Для получения дополнительной информации см. в разделе Создание Owner-Drawn элементов меню.

Система предоставляет специальный тип элемента меню, который называется разделителем , который отображается как горизонтальная линия. С помощью разделителя можно разделить меню на группы связанных элементов. Разделитель нельзя использовать в строке меню, и пользователь не может выбрать разделитель.

Если строка меню содержит больше имен меню, чем будет соответствовать одной строке, система упаковывает строку меню, автоматически разбивая ее на две или более строк. Вы можете вызвать разрыв строки в определенном элементе в строке меню, назначив флаг типа MFT_MENUBREAK элементу. Система помещает этот элемент и все последующие элементы в новую строку.

Если меню содержит больше элементов, чем будет соответствовать одному столбцу, меню будет усечено. Вы можете вызвать разрыв столбца в определенном элементе в меню, назначив флаг типа MFT_MENUBREAK элементу или используя параметр MENUBREAK в инструкции MENUITEM. Система помещает этот элемент и все последующие элементы в новый столбец. Флаг типа MFT_MENUBARBREAK имеет тот же эффект, за исключением того, что вертикальная линия отображается между новым столбцом и старым.

Если вы используете функции AppendMenu, InsertMenuили ModifyMenu для назначения разрывов строк, следует назначить флаги типа MF_MENUBREAK или MF_MENUBARBREAK.

Сообщения, используемые с меню

Система сообщает об активности, связанной с меню, отправляя сообщения в процедуру окна, которому принадлежит меню. Система отправляет ряд сообщений, когда пользователь выбирает элементы в строке меню или нажимает правую кнопку мыши, чтобы отобразить контекстное меню.

Когда пользователь активирует элемент в строке меню, окно владельца сначала получает сообщение WM_SYSCOMMAND. Это сообщение содержит флаг, указывающий, активировал ли пользователь меню с помощью клавиатуры (SC_KEYMENU) или мыши (SC_MOUSEMENU). Дополнительные сведения см. в разделе доступ к меню с помощью клавиатуры.

Затем перед отображением любых меню система отправляет сообщение WM_INITMENU в процедуру окна, чтобы приложение могли изменять меню перед тем, как пользователь увидит их. Система отправляет сообщение WM_INITMENU только один раз для активации меню.

Когда пользователь указывает на элемент меню, открывающий подменю, система отправляет окно владельца WM_INITMENUPOPUP сообщение перед отображением подменю. Это сообщение дает приложению возможность изменять подменю перед отображением.

Каждый раз, когда пользователь перемещает выделение с одного элемента на другой, система отправляет WM_MENUSELECT сообщение в процедуру окна владельца меню. Это сообщение определяет выбранный в данный момент пункт меню. Многие приложения предоставляют информационную область в нижней части основных окон и используют это сообщение для отображения дополнительных сведений о выбранном элементе меню.

Когда пользователь выбирает элемент команды из меню, система отправляет WM_COMMAND сообщение в процедуру окна. Младшее слово параметра wParam сообщения WM_COMMAND содержит идентификатор выбранного элемента. Процедура окна должна проверять идентификатор и обрабатывать сообщение соответствующим образом.

Вы можете сохранить сведения для меню с помощью структурыMENUINFO. Если меню определено с MENUINFO.dwStyle значение MNS_NOTIFYBYPOS, система отправляет WM_MENUCOMMAND вместо WM_COMMAND при выборе элемента. Это позволяет получить доступ к данным в структуре MENUINFO, а также предоставить индекс выбранного элемента напрямую.

Не все меню доступны через строку меню окна. Во многих приложениях отображаются контекстные меню, когда пользователь нажимает правую кнопку мыши в определенном расположении. Такие приложения должны обрабатывать сообщение WM_CONTEXTMENU и отображать контекстное меню при необходимости. Если приложение не отображает контекстное меню, оно должно передать сообщение WM_CONTEXTMENU в функцию DefWindowProc для обработки по умолчанию.

Сообщение WM_MENURBUTTONUP отправляется, когда пользователь освобождает правую кнопку мыши, пока курсор находится в элементе меню. Это сообщение предоставляется, чтобы приложения могли отображать зависимое от контекста или контекстное меню для элемента меню.

Существует несколько сообщений, которые включают только меню с функцией перетаскивания. WM_MENUGETOBJECT отправляется владельцу меню перетаскивания, когда курсор мыши вводит пункт меню меню или перемещается из центра элемента в верхнюю или нижнюю часть элемента. Сообщение WM_MENUDRAG отправляется, когда пользователь фактически перетаскивает элемент меню.

При удалении раскрывающегося меню или подменю система отправляет сообщение WM_UNINITMENUPOPUP.

Если меню назначено окну и это окно уничтожено, система автоматически уничтожает меню и ее подменю, освобождая дескриптор меню и память, занятую меню. Система не автоматически удаляет меню, которое не назначено окну. Приложение должно уничтожить неприсвоенное меню, вызвав функцию DestroyMenu. В противном случае меню продолжает существовать в памяти даже после закрытия приложения. Чтобы завершить активное меню вызывающего потока, используйте EndMenu. Если платформа не поддерживает EndMenu, отправьте владельцу активного меню сообщение WM_CANCELMODE.