Меню. Главные меню и всплывающие меню, страница 5

GetMenuString                                     • Windows 98   «• Windows 2000

 

Описание

Функция GetMenuString выбирает в указанный строковый буфер строку текста пункта, включая символ амперсанда (&), используемый для указания мнемонического символа.

Функция GetMenuString применяется в программах, позволяющих пользователю добавлять и удалять пункты меню, определяемые пользователем, такие как макрокоманды.

 

Синтаксис

int GetMenuString( HMENU hmenu, UINT ultem, LPTSTR Ipsz, int cchMax, UINT uFlags )

 

Параметры

 

hmenu

HMENU. Дескриптор меню.

 

ultem

UINT. Идентификатор пункта меню или позиция, в соответствии с тем, что определено параметром uFlags.

 

Ipsz

LPTSTR Указатель на строковый буфер, который должен содержать строку текста пункта.

 

cchMox

int. Максимальное число символов, которое должно быть записано в буфер. Этот параметр позволяет предотвратить запись за пределами буфера.

 

uFlags

UINT. Указывает способ интерпретации параметра ultem. Этот параметр может иметь одно из значений, приведенных в табл. 6.13.

 

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

 

int. Число выбранных символов.

 

Включаемый файл

winuser.h

 

См. также

GetMenuItemID, GetMenuItemCount, GetMenuState, GetMenuItemlnfo, GetSubMenu

 

Пример

В следующем примере отображается текст пункта меню, когда пользователь выбирает пункт меню Test!.

 

Сн.    \local-sources\chap06\06-17.txt

 

GetSubMenu                                        • Windows 98   • Windows 2000

 

Описание

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

 

Синтаксис

HMENU GetSubMenu( HMENU hmenu, int nPos )

 

Параметры

 

hmenu

HMENU. Дескриптор родительского меню всплывающего меню.

 

nPos

int. Относительная позиция с отсчетом от нуля пункта меню в указанном меню, которое активизирует это всплывающее меню.

 

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

HMENU. Дескриптор всплывающего меню. Возвращаемое значение — NULL, если пункт меню не активизирует всплывающее меню.

 

Включаемый файл

winuser.h

 

См, также

Create PopupMenu. GetMenu, GetMenuItemCount, GetMenuItemID, GetMenuState, GetMenuString, AppendMenu. SetMenuItemlnfo

 

Пример

См. пример для функции SetMenuDefaultltem.

 

GetSystemMenu                                  • Windows 98   • Windows 2000

 

Описание

Функция GetSystemMenu выбирает дескриптор системного меню. Системное меню — это всплывающее меню, которое отображается при щелчке на малой пиктограмме в верхнем левом углу окна. Системное меню вырабатывает сообщение WM_SYSCOMMAND, а не сообщение WM_COMMAND. При активизации пункта системного меню выполняется установка параметра wParam сообщения WM_SYSCOMMAND, как показано в табл. 6.14.

 

Таблица 6.14. ЗначенияпараметраwParam сообщенияWM_SYSCOMMAND

 

Значение

Описание

 

SC_ARRANGE

Упорядочить свернутые пиктограммы окон.

 

SC_CLOSE

Закрыть окно.

 

SC_CONTEXTHELP

Изменить вид курсора на вопросительный знак со стрелкой. Если пользователь затем щелкает на элементе управления в диалоговом окне, элемент управления получает сообщение  WM_HELP.

 

SC_DEFAULT

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

 

SC_HOTKEY

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

 

Включаемый файл

winuser.h

 

См. также

AppendMenu, GetMenu, InsertMenuItem, SetMenuItemlnfo

 

Соответствуклш

le сообщения

 

WM_SYSCOMMAND, WMJNITMENU

 

Пример

В следующем примере к системному меню добавляется пункт меню Test Item после пункта меню Maximize. При выборе нового пункта меню отображается окно сообщения.

 

См.    \local-sources\chap06\06-18. txt

 

HiliteMenultem                                    • Windows 98   • Windows 2000

 

Описание

Обычно высвечивание пунктов меню верхнего уровня обеспечивается за счет автоматических действий мыши и предусмотренной по умолчанию оперативной клавиши. Если высвечивание пунктов меню верхнего уровня необходимо выполнить непосредственно в самой программе, можно применить функцию HiliteMenultem. Функция HiliteMenultem предоставляет дополнительные клавиатурные альтернативы для выбора пунктов меню.

 

Синтаксис

BOOL HiliteMenuItem( HWND hwnd, HMENU hmenu, UINT ultem, UINT uHilite )

 

Параметры

 

hwnd

HWND. Дескриптор окна, которое содержит меню.

 

hmenu

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

 

и Item

UINT. Идентификатор пункта меню, который должен быть высвечен. Могут быть высвечены только пункты меню верхнего уровня.

 

uHilite

UINT. Управляет интерпретацией параметра ultem и указывает, высвечен ли пункт меню. Два значения, приведенные в табл. 6.15, объединяются с помощью двоичного оператора OR (|).

 

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

BOOL. Если пункт меню установлен в указанное высвеченное состояние, возвращаемое значение отлично от нуля; в ином случае возвращаемое значение — нуль.

 

Таблица 6. 15. ЗначенияпараметровuHilite функцииHiliteMenultem

 

Значение

Описание

 

MF_BYCOMMAND

Значение, приведенное в параметре u/tem, представляет собой идентификатор пункта меню.

 

MF_BYPOSITION

Значение, приведенное в параметре u/fem, представляет собой относительную позицию пункта меню с отсчетом от нуля.

 

MF_HILITE

Высветить пункт меню.

 

MF_UNHILITE

Этот пункт меню не высвечен.

 

Включаемый файл

winuser.h

 

Значение

Описание

 

SC_HSCROLL

Выполнить прокрутку по горизонтали.

 

SC_KEYMENU

Выбрать системное меню с применением комбинаций клавиш.

 

SC_MAXIMIZE (или  SC_ZOOM)

Развернуть окно.                                                                                       ;

!

 

SC_MINIMIZE (или SCJCON)

Свернуть окно.                                                                                          1

 

SC_MONITORPOWER

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

 

SC_MOUSEMENU

Выбрать системное меню, как в результате щелчка мышью.

 

SC_MOVE

Переместить окно.

 

SC_NEXTWINDOW

Выполнить перемещение к следующему окну.

 

SC_PREVWINDOW

Выполнить перемещение к предыдущему окну.

 

SC_RESTORE

Восстановить окно в его нормальную позицию и размеры.

 

SC_SCREENSAVE

Выполнить установленное приложение хранителя экрана.

 

SC_SEPARATOR

Никакой пункт меню не выбран, поскольку мышь находится над разделителем.

 

SC_SIZE

Изменить размеры окна.

 

SCJTASKLIST

Активизировать Task Manager (диспетчер задач) Windows.

 

SC_VSCROLL

Выполнить прокрутку по вертикали.

 

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

 

Синтаксис

HMENU GetSystemMenu( HWND hWnd, BOOL bRevert )

 

Параметры

 

hWnd

HWND. Дескриптор окна, которое содержит системное меню.

 

bRevert

BOOL. Если этот параметр имеет значение TRUE, функция уничтожает текущее системное меню и восстанавливает первоначальное системное меню, определенное в Windows. Если этот параметр имеет значение FALSE, функция возвращает дескриптор копии текущего системного меню. Эта копия первоначально идентична системному меню, но может быть изменена.

 

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

HMENU. Если параметр bRevert имеет значение FALSE, возвращаемое значение — дескриптор копии системного меню. Если параметр bRevert имеет значение TRUE, возвращаемое значение — NULL.

 

См. также

CheckMenuItem, EnableMenuItem, SetMenuItemlnfo

 

Пример

См. пример для функции MenuItemFromPoint.

 

InsertMenultem                                  • Windows 98   • Windows 2000

 

Описание

Функция InsertMenultem позволяет добавить новый пункт в любом месте указанного меню. Эта функция является более удобной по сравнению с функцией AppendMenu, которая позволяет добавлять пункты только к концу меню.

 

Синтаксис

BOOL InsertMenuItem( HMENU hMenu, UINT ultem, BOOL bByPosition, LPMENUITEMINFO Ipmii )

 

Параметры

 

hMenu

HMENU. Дескриптор меню, которое должно быть изменено.

 

и It em

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

 

bByPosition

BOOL. Устанавливается в FALSE, если параметр ultem указывает идентификатор пункта меню; в ином случае устанавливается в TRUE для указания позиции пункта меню.

 

Ipmii

LPMENUTTEMINFO. Указатель на структуру MENUTTEMINFO, которая содержит информацию о новом пункте меню. См. определение структуры MENUITEMINFO в описании функции GetMenuItemlnfo

 

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

BOOL. TRUE, если пункт меню был добавлен; в ином случае возвращаемое значение — FALSE.

 

Включаемый файл

winuser.h

 

См. также

GetMenuItemlnfo, AppendMenu, SetMenuItemlnfo, GetMenu, DrawMenuBar CreateMenu, DeleteMenu, RemoveMenu

 

Пример

См. пример для функции GetSystemMenu.

 

IsMenu                                                • Windows 98   • Windows 2000

 

Описание

Функция IsMenu применяется для проверки того, является ли дескриптор действительным дескриптором меню.

 

Синтаксис

BOOL IsMenu( HMENU hMenu )

 

Параметры

 

hMenu

HMENU. Дескриптор, который должен быть проверен.

 

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

BOOL. TRUE, если hMenu дескриптор меню; в ином случае возвращаемое значение — FALSE.

 

Включаемый файл

winuser.h

 

См. также

GetMenu, GetSubMenu, IsWindow

 

Пример

В следующем примере функция IsMenu применяется для определения того, действительно ли пункт меню представляет собой подменю.

 

См.    \local-sources\chap06\06-19.txt

 

LoadAccelerators                                  • Windows 98   * Windows 2000

 

Описание

Комбинации оперативных клавиш определяются в файле ресурса (RC). Прежде чем их можно будет использовать, в приложении необходимо вызвать функцию LoadAccelerators для выборки дескриптора таблицы оперативных клавиш. Этот дескриптор применяется в функции TranslateAccelerator для декодирования поступающих комбинаций клавиш, которые могут быть закодированы в таблице оперативных клавиш. Как и пункты меню, оперативные клавиши вырабатывают сообщение \YM_COMMAND, где в качестве параметра wParam установлено идентификационное значение оперативной   клавиши.   В  большинстве  случаев  это  идентификационное значение совпадает с идентификатором пункта меню, что позволяет применять оперативную клавишу для дублирования действия команды меню. Оперативные клавиши применяются в качестве клавиатурных сокращений для обычных функций, которые в ином случае могут потребовать нескольких действий мышью. Оперативные клавиши могут также использоваться для выработки командных сообщений, не имеющих эквивалентов в меню.

 

Синтаксис

HACCEL LoadAccelerators( HINSTANCE hinst, LPCTSTR IpTableName )

 

Параметры

 

hinst

HINSTANCE. Дескриптор экземпляра для модуля, содержащего определения оперативных клавиш в данных ресурса.

 

Ip Table Name

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

 

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

HACCEL. Возвращает дескриптор таблицы оперативных клавиш, если функция была выполнена успешно; в ином случае возвращаемое значение — NULL. При многократных вызовах функция LoadAccelerators возвращает дескриптор таблицы оперативных клавиш без повторной загрузки данных.

 

Включаемый файл

winuser.h

 

См. также

TranslateAccelerator, CopyAcceleratorTable, CreateAcceleratorTable, DestroyAcceleratorTable

 

Соответствующие сообщения

 

WM_COMMAND

 

Пример

В следующем фрагменте кода показан типичный цикл обработки сообщений в функции WinMain с применением оперативных клавиш. Для загрузки таблицы оперативных клавиш из файла ресурса (RC) приложения может применяться функция LoadAccelerators.

 

hAccel   =   LoadAccelerators (   hinst,    szAppName   );

while (   GetMessage(   Smsg,   NULL,   0,   0)    ) { if   (    ! hAccel   | |    ! TranslateAccelerator (   hWnd,   hAccel,   Smsg   )    ) < TranslateMessage (   Smsg   ) ; DispatchMessage (   &msg   ) ; } }

 

чено к окну с помощью функции SetMenu. Эта функция используется во внутренних операциях Windows, но может быть вызвана непосредственно. Функция LoadMenulndirect может служить альтернативой обычным функциям создания и модификации меню.

Синтаксис

HMENU LoadMenuIndirect( CONST MENUTEMPLATE* IpMenuTemplate )

Параметры

lp Menu Template

CONST MENUTEMPLATE*. Указатель на блок памяти, содержащий определение меню. Шаблон меню состоит из структуры MENUITEMTEMPLATEHEADER, за которой следуют одна или несколько смежных структур MENUITEMTEMPLATE. Расширенный шаблон меню состоит из структуры MENUEX_TEMPLATE_HEADER, за которой следуют одна или несколько смежных структур MENUEX_TEMPLATE_ITEM. См. приведенное ниже определение структур MENUITEMTEMPLATEHEADER и MENUITEMTEMPLATE.

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

HMENU. В случае успешного выполнения возвращаемое значение — дескриптор меню; в ином случае возвращаемое значение — NULL.

Включаемый файл

winuser.h

См. также

LoadMenu, SetMenuItemlnfo. AppendMenu, DrawMenuBar

Определение MENUITEMTEMPLATEHEADER

typedef   struct { WORD   versionNumber; WORD   offset; }   MENUITEMTEMPLATEHEADER;

Члены

versionNumber

WORD. Этот член должен быть установлен равным 0.

offset

WORD. Число байтов от конца заголовка до первых данных MENUITEMTEMPLATE. Это значение обычно равно 0, при условии, что данные пункта меню располагаются в памяти сразу после заголовка. Каждый пункт меню определен в структуре данных MENUITEMTEMPLATE. Если параметр mtOption указывает тип MF_POPUP, параметр mtID должен быть опущен.

Определение MENUITEMTEMPLATE

typedef   struct { WORD   mtOption ; WORD  mtID; WCHAR  mtString [ 1] ; }   MENUITEMTEMPLATE ;

Члены

mtOption

WORD. Аналогичен параметру uFlags функции AppendMenu и может принимать значения, приведенные в табл. 6.2.

mtID

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

mtString

WCHAR[1]. Первый символ строки пункта меню. Остальные символы следуют непосредственно за mtString, и в конце символьной строки находится нулевой символ.

LoadMenu                                           • Windows 98   • Windows 2000

 

Описание

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

 

Синтаксис

HMENU LoadMenu( HINSTANCE hinst, LPCTSTR IpMenuName )

 

Параметры

 

hinst

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

 

IpMenuName

LPCTSTR. Указатель на строку с нулевым символом в конце, которая содержит имя загружаемого меню. Этот параметр может также указывать идентификатор ресурса с помощью макрокоманды MAKEINTRESOURCE.

 

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

 

HMENU. Дескриптор меню; NULL, если меню не было найдено.

 

Включаемый файл

winuser.h

 

См. также

Destroy Menu, LoadMenulndirect, Set Menu

 

Пример

В следующем примере в приложении главное меню переключается между "OLDMENU" и "NEWMENU". При выборе опции меню New Menu! из файла ресурса (RC)  загружается меню "NEWMENU" и устанавливается в качестве главного меню. При выборе опции меню Old Menu! из нового меню загружается первоначальное меню и снова устанавливается в качестве главного меню.

 

Определение меню в файле ресурса (.RC)

OLDMENU   MENU   DISCARDABLE BEGIN POPUP   "SFile" BEGIN MENUITEM   "ESxit" ,                       IDM_EXIT END MENUITEM   "SNew  Menu!"                       IDM_NEW END NEWMENU  MENU   DISCARDABLE BEGIN POPUP   "SFile" BEGIN MENUITEM   "ESxit" ,                       IDM_EXIT END MENUITEM   "SOld  Menu!",                     IDMJDLD END

Функция WndProc

 

cm.    \local-sources\chap06\06-20.txt

 

LoadMenulndirect                               • Windows 98   • Windows 2000

 

Описание

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

 

Пример

Как показано на рис. 6.5, в следующем примере создается новое меню при обработке сообщения \VM_CREATE. Это меню определено в глобальном блоке памяти. Функция AppendMemory в нижней части листинга применяется для упрощения работы с полями переменной длины, применяемыми для определения меню. Эта функция добавляет смежные порции данных к концу блока памяти и преобразует строки в формат расширенного представления символов (Unicode).