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

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

Синтаксис

BOOL TrackPopupMenuEx(
  [in]           HMENU       hMenu,
  [in]           UINT        uFlags,
  [in]           int         x,
  [in]           int         y,
  [in]           HWND        hwnd,
  [in, optional] LPTPMPARAMS lptpm
);

Параметры

[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_HORIZONTAL
0x0000L
Если меню не может отображаться в указанном месте без перекрытия исключенного прямоугольника, система пытается разместить запрошенное горизонтальное выравнивание до запрошенного вертикального выравнивания.
TPM_VERTICAL
0x0040L
Если меню не может быть отображено в указанном месте без перекрытия исключенного прямоугольника, система пытается вместить запрошенное вертикальное выравнивание до запрошенного горизонтального выравнивания.
 

Исключенный прямоугольник — это часть экрана, на которую меню не должно перекрываться; он задается параметром lptpm .

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

[in] x

Тип: int

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

[in] y

Тип: int

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

[in] hwnd

Тип: HWND

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

[in, optional] lptpm

Тип: LPTPMPARAMS

Указатель на структуру TPMPARAMS , указывающую область экрана, которую меню не должно перекрывать. Этот параметр может принимать значение NULL.

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

Тип: BOOL

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

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

Комментарии

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

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

Требования

Требование Значение
Минимальная версия клиента 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-1 (появилось в Windows 8.1)

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

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

CreatePopupMenu

GetSubMenu

Меню

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

TPMPARAMS

WM_COMMAND