Функция TrackPopupMenu (winuser.h)

Отображает контекстное меню в указанном расположении и отслеживает выбор элементов в меню. Контекстное меню может появиться в любом месте экрана.

Синтаксис

BOOL TrackPopupMenu(
  [in]           HMENU      hMenu,
  [in]           UINT       uFlags,
  [in]           int        x,
  [in]           int        y,
  [in]           int        nReserved,
  [in]           HWND       hWnd,
  [in, optional] const RECT *prcRect
);

Параметры

[in] hMenu

Тип: HMENU

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

[in] uFlags

Тип: UINT

Используйте ноль из этих флагов для указания параметров функции.

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

Значение Значение
TPM_CENTERALIGN
0x0004L
Центр контекстного меню по горизонтали относительно координаты, заданной параметром x .
TPM_LEFTALIGN
0x0000L
Размещает контекстное меню таким образом, чтобы его левая сторона была выровнена по координате, заданной параметром x .
TPM_RIGHTALIGN
0x0008L
Размещает контекстное меню таким образом, чтобы его правая сторона была выровнена по координате, заданной параметром x .
 

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

Значение Значение
TPM_BOTTOMALIGN
0x0020L
Размещает контекстное меню таким образом, чтобы его нижняя сторона была выровнена по координате, заданной параметром y .
TPM_TOPALIGN
0x0000L
Размещает контекстное меню таким образом, чтобы его верхняя сторона была выровнена по координате, заданной параметром y .
TPM_VCENTERALIGN
0x0010L
Центр контекстного меню по вертикали относительно координаты, заданной параметром y .
 

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

Значение Значение
TPM_NONOTIFY
0x0080L
Функция не отправляет уведомления, когда пользователь щелкает пункт меню.
TPM_RETURNCMD
0x0100L
Функция возвращает идентификатор элемента меню выбора пользователем в возвращаемом значении.
 

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

Значение Значение
TPM_LEFTBUTTON
0x0000L
Пользователь может выбрать пункты меню только левой кнопкой мыши.
TPM_RIGHTBUTTON
0x0002L
Пользователь может выбирать пункты меню с помощью левой и правой кнопки мыши.
 

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

Значение Значение
TPM_HORNEGANIMATION
0x0800L
Анимирует меню справа налево.
TPM_HORPOSANIMATION
0x0400L
Анимирует меню слева направо.
TPM_NOANIMATION
0x4000L
Отображает меню без анимации.
TPM_VERNEGANIMATION
0x2000L
Анимирует меню снизу вверх.
TPM_VERPOSANIMATION
0x1000L
Анимирует меню сверху вниз.
 

Для любой анимации функция SystemParametersInfo должна задать SPI_SETMENUANIMATION. Кроме того, все флаги TPM_*ANIMATION, кроме TPM_NOANIMATION, игнорируются, если включена анимация исчезания меню. Дополнительные сведения см. в разделе Флаг SPI_GETMENUFADE в SystemParametersInfo.

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

Для разметки текста справа налево используйте TPM_LAYOUTRTL. По умолчанию макет текста слева направо.

[in] x

Тип: int

Горизонтальное расположение контекстного меню в координатах экрана.

[in] y

Тип: int

Вертикальное расположение контекстного меню в координатах экрана.

[in] nReserved

Тип: int

Защищены; значение должно быть равно нулю.

[in] hWnd

Тип: HWND

Дескриптор окна, которому принадлежит контекстное меню. Это окно получает все сообщения из меню. Окно не получает сообщение WM_COMMAND из меню, пока функция не вернет. Если указать TPM_NONOTIFY в параметре uFlags , функция не отправляет сообщения в окно, определенное hWnd. Однако по-прежнему необходимо передать дескриптор окна в hWnd. Это может быть любой дескриптор окна из приложения.

[in, optional] prcRect

Тип: const RECT*

Не обрабатывается.

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

Тип: BOOL

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

Если не указать TPM_RETURNCMD в параметре uFlags , возвращаемое значение будет ненулевым, если функция выполнена успешно, и нулевым значением в случае сбоя. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Вызовите Метод GetSystemMetrics с SM_MENUDROPALIGNMENT , чтобы определить правильный флаг горизонтального выравнивания (TPM_LEFTALIGN или TPM_RIGHTALIGN) и (или) флаг направления горизонтальной анимации (TPM_HORPOSANIMATION или TPM_HORNEGANIMATION), который необходимо передать в TrackPopupMenu или TrackPopupMenuEx. Это важно для создания оптимального взаимодействия с пользователем, особенно при разработке приложений Microsoft Tablet PC.

Чтобы указать область экрана, которая не должна перекрываться меню, используйте функцию TrackPopupMenuEx

Чтобы отобразить контекстное меню для значка уведомления, текущее окно должно быть окном переднего плана, прежде чем приложение вызовет TrackPopupMenu или TrackPopupMenuEx. В противном случае меню не исчезнет, когда пользователь щелкает за пределами меню или окна, создавшего меню (если оно отображается). Если текущее окно является дочерним, необходимо задать родительское окно (верхнего уровня) в качестве окна переднего плана.

Однако если текущее окно является окном переднего плана, при втором отображении этого меню оно появляется, а затем сразу исчезает. Чтобы исправить это, необходимо принудительно переключить задачу на приложение с именем TrackPopupMenu. Это делается путем публикации неопасного сообщения в окно или поток, как показано в следующем примере кода:


   SetForegroundWindow(hDlg);

   // Display the menu
   TrackPopupMenu(   hSubMenu,
                     TPM_RIGHTBUTTON,
                     pt.x,
                     pt.y,
                     0,
                     hDlg,
                     NULL);

   PostMessage(hDlg, WM_NULL, 0, 0);
 

Примеры

Пример см. в разделе Отображение контекстного меню.

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-menu-l1-1-0 (представлено в Windows 8)

См. также раздел

Основные понятия

CreatePopupMenu

GetSubMenu

Меню

Справочные материалы

TrackPopupMenuEx

WM_COMMAND