给窗口添加右键菜单 WM_CONTEXTMENU
来源:互联网 发布:远程网络教育学费 编辑:程序博客网 时间:2024/06/05 01:02
在view派生类中添加 WM_CONTEXTMENU 消息
例如:
void CZxView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);
//这里设置菜单由左边界X轴对齐|并且鼠标的左右键都可以选择菜单项
}
另一种形式:
void ClistcontrolView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pMenu = menu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this,0);
//这里设置菜单由左边界X轴对齐|并且鼠标的左右键都可以选择菜单项
}
其中 m.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);
//处理上下文菜单,也就是右键单击弹出的菜单,在右键单击的时候发出这个消息
上下文菜单不是通过LoadFram()挂接在顶层菜单上的,而是通过TrackPopupMenu函数来显示,
m.GetSubMenu(0):获得指向菜单m第一个顶层项的指针,把该项作为上下文菜单
TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this):
指定上下文菜单显示的方式,显示位置(x,y),窗口,this表示在当前窗口显示
m.GetSubMenu(0):获得指向菜单m第一个顶层项的指针,顶层菜单项是那些在窗口顶部显示的菜单项,
===========================================================================================================
应该是WM_RBUTTONUP和WM_CONTEXTMENU比较相似,是右键释放的时候,这2个消息都会响应。
DefWindowProc generates the WM_CONTEXTMENU message when it processes the WM_RBUTTONUP or WM_NCRBUTTONUP message or when the user types SHIFT+F10. The WM_CONTEXTMENU message is also generated when the user presses and releases the VK_APPS key.
可见,一般WM_RBUTTONUP都会伴随着WM_CONTEXTMENU,但如果收到WM_CONTEXTMENU未必就收到WM_RBUTTONUP,还可能是 WM_NCRBUTTONUP,又可能是按下SHIFT+F10了。
===========================================================================================================
GetSubMenu函数
API函数
函数功能:该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄。
函数原型:HMENU GetSubMenu(HMENU hMenu,int nPos);
参数: hMenu:菜单句柄。 nPos:激活下拉式菜单或子菜单的菜单项相对于零的位置。
返回值:如果函数调用成功,返回值是菜单项激活的下拉式菜单或子菜单的句柄。如果菜单项没有激活一个下拉式菜单或子菜单,返回值是NULL。
MFC类成员函数
CMenu::GetSubMenu CMenu* GetSubMenu( int nPos ) const;
返回值: 若弹出菜单位于指定的位置,则返回CMenu 对象的指针,其中CMenu对象要包含弹出菜单的句柄;否则为NULL。如果CMenu 对象不存在,那么将创建临时的CMenu 对象。但返回的CMenu指针不应被存储。
参数: nPos 指定包含在菜单中的弹出菜单的位置。对于第一个菜单项,位置值开始为0。弹出菜单的标识符不能被该函数使用。
说明:获取弹出菜单的CMenu对象。
TrackPopupMenu函数
函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置。
函数原型:BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,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,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。
PrcRect:未用。
返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用GetLastError
- 给窗口添加右键菜单 WM_CONTEXTMENU
- 给窗口添加右键菜单 WM_CONTEXTMENU
- DockPanel去掉右键默认的菜单的方法:在该类上添加WM_CONTEXTMENU消息即可
- 右键菜单添加命令行窗口
- 给CListCtrl添加右键菜单
- 给CListCtrl添加右键菜单
- 给CListCtrl添加右键菜单
- 给DataGridView添加右键菜单
- 给DataGridView添加右键菜单
- 给CListCtrl添加右键菜单
- 给表格添加右键菜单
- mfc在窗口中添加右键菜单
- 如何给CTreeCtrl 添加右键菜单
- 给右键添加菜单(editplus)
- 如何给CTreeCtrl 添加右键菜单
- 给右键菜单添加cmd快捷通道
- 给ubuntu添加右键打开菜单
- DevExpress 给TreeList添加右键菜单
- tomcat内存溢出的配置
- TCP/UDP常见端口
- Single Number(c++)
- java web 面试题
- ViewPager获取当前显示的fragment
- 给窗口添加右键菜单 WM_CONTEXTMENU
- eclipse多行注释快捷键以及撤销注释
- Android手机设置代理
- 解决服务器访问打开防火墙个别网段不好使的问题
- QQ-实现有界面的聊天室
- C语言--main(int argc char**argv)具体用法
- vmware workstation 9安装教程(图文)
- 解决singleTask Activity 在onNewIntent中无法获得值的问题
- android xml解析 XmlPullParser的使用