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

Операционная система Microsoft Windows 3.1 для программиста

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

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

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

При необходимости ваше приложение может создать временное плавающее меню , расположенное в любом месте экрана (рис. 1.7).

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

if(msg == WM_RBUTTONDOWN)
{
  HMENU hmenuPopup;
  POINT pt;

  pt = MAKEPOINT(lParam);
  ClientToScreen(hwnd, &pt);

  hmenuPopup = CreatePopupMenu();

  AppendMenu(hmenuPopup, MF_BYCOMMAND | MF_ENABLED,
       CM_FILENEW, "&New");
  AppendMenu(hmenuPopup, MF_BYCOMMAND | MF_ENABLED,
       CM_FILEOPEN, "&Open");
  AppendMenu(hmenuPopup, MF_BYCOMMAND | MF_ENABLED,
       CM_FILESAVE, "&Save");
  AppendMenu(hmenuPopup, MF_SEPARATOR, 0, 0);
  AppendMenu(hmenuPopup, MF_BYCOMMAND | MF_ENABLED,
       CM_FILEEXIT, "E&xit");

  TrackPopupMenu(hmenuPopup,
    TPM_CENTERALIGN | TPM_LEFTBUTTON,
    pt.x, pt.y, 0, hwndMain, NULL);

  DestroyMenu(hmenuPopup);
}

Обработчик сообщения WM_RBUTTONDOWN, которое приходит, если вы нажимаете правую клавишу мыши, прежде всего преобразует координаты курсора мыши в экранные. Для этого он вызывает функцию ClientToScreen .

Далее при помощи функции CreatePopupMenu создается пустое временное меню. Это меню наполняется обычным образом с помощью функции AppendMenu, но оно не привязывается к главному меню приложения или какому-либо другому меню. Вместо этого создается плавающее меню. Для этого идентификатор созданного и наполненного временного меню передается функции TrackPopupMenu :

TrackPopupMenu(hmenuPopup,
  TPM_CENTERALIGN | TPM_LEFTBUTTON,
  pt.x, pt.y, 0, hwndMain, NULL);

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

После этого созданное временное меню уничтожается:

DestroyMenu(hmenuPopup);

Приведем прототип функции TrackPopupMenu :

BOOL WINAPI TrackPopupMenu(HMENU hmenu, UINT fuFlags,
   int x, int y, int nReserved, 
   HWND hwnd, const RECT FAR* lprc);

Параметр hmenu должен содержать идентификатор отображаемого временного меню. Вы можете создать новое меню при помощи функции CreatePopupMenu или получить идентификатор существующего временного меню, вызвав функцию GetSubMenu.

Параметр fuFlags определяет расположение плавающего меню и клавиши мыши, с помощью которых должен выполняться выбор.

Для определения расположения меню вы можете указать один из трех флагов:

Флаг Описание
TPM_CENTERALIGN Центровка относительно координаты, заданной параметром x
TPM_LEFTALIGN Выравнивание по левой границе относительно координаты, заданной параметром x
TPM_RIGHTALIGN Выравнивание по правой границе относительно координаты, заданной параметром x

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

Флаг Описание
TPM_LEFTBUTTON Левая клавиша мыши
TPM_RIGHTBUTTON Правая клавиша мыши

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

Параметр hwnd задает идентификатор окна, которое получит сообщение WM_COMMAND после того как пользователь сделает выбор из плавающего меню. В операционной системе Windows версии 3.1 это сообщение попадает в функцию указанного окна после того как функция TrackPopupMenu возвратит управление. В версии 3.0 сообщение WM_COMMAND попадало в функцию окна до возврата управления функцией TrackPopupMenu.

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

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