通过TrackPopupMenu函数弹出菜单
来源:互联网 发布:淘宝怎么避免虚假交易 编辑:程序博客网 时间:2024/06/14 21:27
如果你写一个win32程序,你想在某个条目上鼠标右键,弹出一个简单的菜单,该菜单就有一个选项。
那么,你不用费很大的力气去设计这个菜单,也不需要写一个xml等,你只需要使用TrackPopupMenu函数来实现这个简单的梦想。
msdn是这样描述的:
Displays a shortcut menu at the specified location and tracks the selection of items on the menu. The shortcut menu can appear anywhere on the screen.
看到了吧,是一个shortcut菜单,更重要的是可以展示在屏幕的任何位置,只要你愿意。这时候,你应该迫不及待看看函数语法了吧:
BOOL WINAPI TrackPopupMenu( _In_ HMENU hMenu, _In_ UINT uFlags, _In_ int x, _In_ int y, _In_ int nReserved, _In_ HWND hWnd, _In_opt_ const RECT *prcRect);
各个参数又是什么意思:
hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置快捷菜单:
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(注意:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。当不设置TPM_NONOTIFY和TPM_RETURNCMD时,程序给自己发送了一个WM_COMMAND消息,以返回的ID号为参数wParam的值)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。
PrcRect:未用。
返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。
还是同样的原则,无需记住每个参数如何设置,用的时候会查阅就可以了。
这里要特别注意的是参数X,和参数Y,为了让你信服,看下msdn如何描述这两个参数的吧:
x :The horizontal location of the shortcut menu, in screen coordinates.
y :The vertical location of the shortcut menu, in screen coordinates.
看到了吗,是相对于屏幕坐标系的,或可以说是相对screen的。
那么问题就来了,在我们开发的程序中,几乎使用的都是相对于client的坐标系。
所以,特别需要注意的是,如果你的整个程序都使用的是相对于client,那么再使用TrackPopupMenu函数时,需要进行坐标转换。需要使用的函数就是ClientToScreen()。
而关于ClientToScreen和ScreenToClient函数我将在下一篇博客中介绍。
如果我不知道我的窗口上的鼠标点击的坐标是相对于哪个坐标系咋办呢?而且我又不想仔细研读代码呢?好吧,你可以http://www.pc6.com/softview/SoftView_37569.html下载一个鼠标精灵,然后鼠标点击你的客户端或是window,就可以看出该点击的x,y坐标了,就可以做出判断了!
最后,上一段代码:
ClientToScreen(m_hWnd, &msg.ptMouse); int cmd = TrackPopupMenu(session_im_menu_, TPM_RETURNCMD| TPM_LEFTALIGN| TPM_TOPALIGN, msg.ptMouse.x + 30, msg.ptMouse.y + 10, NULL, m_hWnd,NULL);
- 通过TrackPopupMenu函数弹出菜单
- 通过TrackPopupMenu函数弹出菜单
- 弹出菜单TrackPopupMenu与Ctree结合
- 函数TrackPopupMenu()
- 菜单编程 (TrackPopupMenu)
- 孙鑫VC++深入详解:Lesson6 Part3 ---创建右键弹出菜单 TrackPopupMenu
- TrackPopupMenu函数参数
- 从TrackPopupMenu(创建快捷菜单的函数)看菜单消息路由机制
- 如何使用TrackPopupMenu创建菜单
- trackpopupmenu
- 解决TrackPopupMenu显示菜单不全的问题
- Android 通过按钮弹出菜单(通过Button显示菜单)
- Android 通过按钮弹出菜单(通过Button显示菜单)
- TrackPopupMenu时Setcheck等函数无效解决办法
- 通过Animator实现弧形弹出菜单
- TrackPopupMenu SetCheck(1)无效? 点击其他地方快捷菜单不消失?
- 系统托盘图标显示菜单(TrackPopupMenu)无法自动消失解决方法
- Android通过PopupMenu定义弹出菜单的位置
- Android 【百度地图】 基础配置(1)
- kvc 定义 model
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- 深入理解java异常处理机制
- 练习
- 通过TrackPopupMenu函数弹出菜单
- Trie树的两种实现 - hiho一下
- Hibernate的generator属性
- java一步一脚印—java基本类型的读写
- [笔记] Convex Optimization 2015.09.30
- SQL命令大全(也有HTML/css;JavaScript;Web Services)
- 用vs2010环境下的MPICH2编程的几个注意点(附:无法include头文件的原因)
- 中国第四波创业致富潮来临,你抓住机会了吗?
- ruby gem管理