Функция 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
Используйте ноль из этих флагов для указания параметров функции.
Используйте один из следующих флагов, чтобы указать, как функция размещает контекстное меню по горизонтали.
Используйте один из следующих флагов, чтобы указать, как функция располагает контекстное меню по вертикали.
Используйте следующие флаги для управления обнаружением выбора пользователя без настройки родительского окна для меню.
Используйте один из следующих флагов, чтобы указать, какую кнопку мыши отслеживает контекстное меню.
Используйте любое разумное сочетание следующих флагов, чтобы изменить анимацию меню. Например, выбрав горизонтальный и вертикальный флаги, можно добиться диагональной анимации.
Для любой анимации функция 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) |
См. также раздел
Основные понятия
Справочные материалы