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
使用以上标志中的零个来指定函数选项。
使用以下标志之一指定函数水平定位快捷菜单的方式。
Value | 含义 |
---|---|
|
快捷菜单相对于 x 参数指定的坐标水平居中。 |
|
定位快捷菜单,使其左侧与 x 参数指定的坐标对齐。 |
|
定位快捷菜单,使其右侧与 x 参数指定的坐标对齐。 |
使用以下标志之一指定函数如何垂直定位快捷菜单。
Value | 含义 |
---|---|
|
定位快捷菜单,使其底部与 y 参数指定的坐标对齐。 |
|
定位快捷菜单,使其顶部与 y 参数指定的坐标对齐。 |
|
快捷菜单相对于 y 参数指定的坐标垂直居中。 |
使用以下标志控制用户选择的发现,而无需为菜单设置父窗口。
Value | 含义 |
---|---|
|
当用户单击菜单项时,函数不会发送通知消息。 |
|
函数在返回值中返回用户选择的菜单项标识符。 |
使用以下标志之一指定快捷菜单跟踪的鼠标按钮。
Value | 含义 |
---|---|
|
用户只能使用鼠标左键选择菜单项。 |
|
用户可以使用鼠标左键和右键选择菜单项。 |
使用以下标志的任何合理组合来修改菜单的动画。 例如,通过选择水平标志和垂直标志,可以实现对角动画。
若要发生任何动画, SystemParametersInfo 函数必须设置 SPI_SETMENUANIMATION。 此外,如果打开菜单淡出动画,则忽略除TPM_NOANIMATION以外的所有 TPM_*ANIMATION 标志。 有关详细信息,请参阅 SystemParametersInfo 中的 SPI_GETMENUFADE 标志。
使用 TPM_RECURSE 标志在已显示另一个菜单时显示菜单。 这旨在支持菜单中的上下文菜单。
对于从右到左的文本布局,请使用 TPM_LAYOUTRTL。 默认情况下,文本布局为从左到右。
[in] x
类型: int
快捷菜单的水平位置(以屏幕坐标表示)。
[in] y
类型: int
快捷菜单的垂直位置(以屏幕坐标表示)。
[in] nReserved
类型: int
保留;必须为零。
[in] hWnd
类型:HWND
拥有快捷菜单的窗口的句柄。 此窗口接收来自菜单的所有消息。 在函数返回之前,窗口不会从菜单接收 WM_COMMAND 消息。 如果在 uFlags 参数中指定TPM_NONOTIFY,则函数不会将消息发送到 由 hWnd 标识的窗口。 但是,仍必须在 hWnd 中传递窗口句柄。 它可以是应用程序中的任何窗口句柄。
[in, optional] prcRect
类型: const RECT*
已忽略。
返回值
类型: BOOL
如果在 uFlags 参数中指定TPM_RETURNCMD,则返回值是用户选择的项的菜单项标识符。 如果用户取消菜单而不进行选择,或者发生错误,则返回值为零。
如果未在 uFlags 参数中指定TPM_RETURNCMD,则如果函数成功,则返回值为非零,如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
使用SM_MENUDROPALIGNMENT调用 GetSystemMetrics 以确定正确的水平对齐标志 (TPM_LEFTALIGN或TPM_RIGHTALIGN) 和/或水平动画方向标志 (传递给 TrackPopupMenu 或 TrackPopupMenuEx的TPM_HORPOSANIMATION或TPM_HORNEGANIMATION) 。 这对于创建最佳用户体验至关重要,尤其是在开发 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 |
标头 | winuser.h (包括 Windows.h) |
Library | User32.lib |
DLL | User32.dll |
API 集 | windows 8 中引入的 ext-ms-win-ntuser-menu-l1-1-0 () |
请参阅
概念性
引用