Win32 API. Меню
Страница 5. Пункты меню


 

Пункты меню

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

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

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

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

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

Идентификатор пункта меню.

Уникальное, определяемое программой целое число, связанное с каждым пунктом меню, называется идентификатором пункта меню (menu-item identifier). Когда пользователь выбирает командный пункт из меню, Windows отправляет идентификатор пункта окну владельцу как часть сообщения WM_COMMAND. Оконная процедура проверяет идентификатор, чтобы установить источник сообщения и обрабатывает сообщение соответственно. Кроме того, Вы можете определить пункт меню, используя его идентификатор, когда вызываете функции меню; например, чтобы включить или отключить пункт меню.

Идентификатор пункта меню должен быть значением от 0 до 65,535, даже притом, что это - 32-разрядное целое число. Это так потому, что сообщение WM_COMMAND посылает идентификатор пункта меню как младшее слово параметра wParam.

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

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

Позиция пункта меню

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

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

Заданные по умолчанию пункты меню

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

Пункты меню с галочкой и без галочки

Пункт меню может быть или отмечен "галочкой" или без "галочки". Windows показывает на экране точечный рисунок рядом с отмеченными пунктами меню, чтобы обозначить их отмеченное состояние с "галочкой". Windows не показывает на экране точечный рисунок рядом с пунктами без "галочки", если определяемый программой точечный рисунок "без "галочки"" не определен. В меню только пункты могут быть отмечены "галочкой"; в строке меню командные пункты не могут быть отмечены "галочкой".

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

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

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

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

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

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

Включенные, недоступные и заблокированные пункты меню

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

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

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

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

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

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

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

Нарисованные пользователем (собственные) пункты меню

Прикладная программа может полностью управлять внешним видом пункта меню при помощи использования нарисованного пользователем (собственного) пункта (owner-drawn item). Нарисованные пользователем пункты требуют, чтобы приложение брало всю ответственность на себя за состояние прорисовки выбора (выделения), "галочки" и снятие отметки "галочкой". Например, если прикладная программа предоставляет меню шрифта, она может прописывать каждый пункт меню при помощи использования соответствующего шрифта; пункт для Латинского шрифта будет прописан латинским, пункт для Курсива будет прописан курсивом и так далее.

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

Разделители пунктов меню и переносы строк

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

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

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

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

 

 
« Предыдущая статья   Следующая статья »