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 含义
TPM_CENTERALIGN
0x0004L
快捷菜单相对于 x 参数指定的坐标水平居中。
TPM_LEFTALIGN
0x0000L
定位快捷菜单,使其左侧与 x 参数指定的坐标对齐。
TPM_RIGHTALIGN
0x0008L
定位快捷菜单,使其右侧与 x 参数指定的坐标对齐。
 

使用以下标志之一指定函数如何垂直定位快捷菜单。

Value 含义
TPM_BOTTOMALIGN
0x0020L
定位快捷菜单,使其底部与 y 参数指定的坐标对齐。
TPM_TOPALIGN
0x0000L
定位快捷菜单,使其顶部与 y 参数指定的坐标对齐。
TPM_VCENTERALIGN
0x0010L
快捷菜单相对于 y 参数指定的坐标垂直居中。
 

使用以下标志控制用户选择的发现,而无需为菜单设置父窗口。

Value 含义
TPM_NONOTIFY
0x0080L
当用户单击菜单项时,函数不会发送通知消息。
TPM_RETURNCMD
0x0100L
函数在返回值中返回用户选择的菜单项标识符。
 

使用以下标志之一指定快捷菜单跟踪的鼠标按钮。

Value 含义
TPM_LEFTBUTTON
0x0000L
用户只能使用鼠标左键选择菜单项。
TPM_RIGHTBUTTON
0x0002L
用户可以使用鼠标左键和右键选择菜单项。
 

使用以下标志的任何合理组合来修改菜单的动画。 例如,通过选择水平标志和垂直标志,可以实现对角动画。

Value 含义
TPM_HORNEGANIMATION
0x0800L
对菜单进行从右到左的动画处理。
TPM_HORPOSANIMATION
0x0400L
对菜单进行从左到右的动画处理。
TPM_NOANIMATION
0x4000L
显示不带动画的菜单。
TPM_VERNEGANIMATION
0x2000L
从下到上对菜单进行动画处理。
TPM_VERPOSANIMATION
0x1000L
从上到下对菜单进行动画处理。
 

若要发生任何动画, 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_LEFTALIGNTPM_RIGHTALIGN) 和/或水平动画方向标志 (传递给 TrackPopupMenu 或 TrackPopupMenuEx的TPM_HORPOSANIMATIONTPM_HORNEGANIMATION) 。 这对于创建最佳用户体验至关重要,尤其是在开发 Microsoft Tablet PC 应用程序时。

若要指定菜单不应重叠的屏幕区域,请使用 TrackPopupMenuEx 函数

若要显示通知图标的上下文菜单,在应用程序调用 TrackPopupMenuTrackPopupMenuEx 之前,当前窗口必须是前台窗口。 否则,当用户在菜单或创建菜单的窗口外部单击时,菜单不会消失 (如果它) 可见。 如果当前窗口是子窗口,则必须将 (顶级) 父窗口设置为前台窗口。

但是,当当前窗口是前台窗口时,第二次显示此菜单时,它会出现,然后立即消失。 若要更正此问题,必须强制将任务切换到名为 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 ()

请参阅

概念性

CreatePopupMenu

GetSubMenu

菜单

引用

TrackPopupMenuEx

WM_COMMAND