Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

[Назад] [Содеожание] [Дальше]

3.4. Плавающее меню

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

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

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

hwndPopupMenu = WinLoadMenu (hWnd, 
  NULLHANDLE, POPUP_MENU);
. . .
WinPopupMenu (hWnd, hWnd, hwndPopupMenu,
    SHORT1FROMMP (mp1), SHORT2FROMMP (mp1),
    IDM_FILE_NEW,
    PU_POSITIONONITEM | PU_HCONSTRAIN | PU_VCONSTRAIN |
    PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_KEYBOARD);

Прототип функции WinLoadMenu представлен ниже:

HWND WinLoadMenu (
  HWND hwndFrame, // родительское окно
  HMODULE hmod,   // идентификатор ресурса
  HWND idMenu);   // идентификатор окна меню

Через параметр hwndFrame функции WinLoadMenu следует передать идентификатор окна Frame Window , которое станет родительским для загружаемого меню. Можно также указывать идентификаторы объектного окна HWND_OBJECT и окна рабочего стола HWND_DESKTOP .

Параметр hmod должен содержать идентификатор модуля, из ресурсов которого загружается меню. В качестве такого модуля может выступать либо загрузочный файл приложения, либо библиотека динамической загрузки DLL. В первом случае значение параметра hmod может быть равно NULLHANDLE. Вторую возможность мы рассмотрим позже, когда будем рассказывать о библиотеках DLL.

Параметр idMenu предназначен для передачи идентификатора меню, с которым это меню определено в файле описания ресурсов.

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

Функция WinPopupMenu , при помощи которой выполняется отображение плавающего меню, имеет такой прототип:

BOOL WinPopupMenu (
  HWND hwndParent, // родительское окно
  HWND hwndOwner,  // окно-владелец
  HWND hwndMenu,   // идентификатор плавающего меню
  LONG x,          // координата X для отображения меню
  LONG y,          // координата Y для отображения меню
  LONG idItem,     // идентификатор строки меню, 
                // которая будет выбрана по умолчанию
  ULONG fs);       // дополнительные параметры

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

Параметр hwndMenu предназначен для передачи идентификатора отображаемого плавающего меню, загруженного ранее при помощи функции WinLoadMenu .

Через параметры x и y необходимо передать координаты, которые будут использованы для определения места отображения меню. Если плавающее меню отображается после щелчка левой или правой клавишей мыши, эти координаты имеет смысл сделать равными координатам курсора мыши в момент щелчка.

Параметр idItem используется в зависимости от значения дополнителных параметров fs. Дополнительные параметры указываются как комбинация следующих значений, которые можно объединять при помощи логической операции ИЛИ:

Значение Описание
PU_POSITIONONITEM Меню размещается таким образом, что строка меню, идентификатор которой указан при помощи параметра idItem, имеет координаты, заданные параметрами x и y
PU_HCONSTRAIN Меню размещается на экране таким образом, что оно полностью отображается по своей ширине
PU_VCONSTRAIN Аналогично предыдущему, но по высоте
PU_MOUSEBUTTON1DOWN Меню отображается, когда нажата левая клавиша мыши, и исчезает, когда пользователь отжимает левую клавишу мыши
PU_MOUSEBUTTON2DOWN Аналогично предыдущему, но для правой клавиши двухкнопочной мыши или средней клавиши трехкнопочной мыши
PU_MOUSEBUTTON3DOWN Аналогично предыдущему, но используется для правой клавиши трехклавишной мыши
PU_NONE Меню отображается без предварительного выбора какой-либо строки
PU_SELECTITEM Если дополнительно указано значение PU_NONE, при отображении меню выделяется строка с идентификатором, переданным через параметр idItem. Если же этот идентификатор соответствует вложенному меню, последнее отображается в раскрытом состоянии
PU_KEYBOARD Для работы с меню можно использовать клавиатуру
PU_MOUSEBUTTON1 Для работы с меню можно использовать левую клавишу мыши
PU_MOUSEBUTTON2 Для работы с меню можно использовать правую клавишу двухкнопочной мыши или среднюю клавишу трехкнопочной мыши
PU_MOUSEBUTTON3 Для работы с меню можно использовать правую клавишу трехкнопочной мыши

Если плавающее меню отображено, функция WinPopupMenu возвращает значение TRUE. При ошибке возвращается значение FALSE.

[Назад] [Содеожание] [Дальше]