怎样添加右键快捷菜单
作者:济南职业学院 电子系 朱志强 时间: 2010年6月13日
学习VC,就想着让自己的软件和别人的一样,也可以使用右键。。自己就在网上搜集资料,最后总算是整出来了……把经验和方法和大家分享一下,让那些自己一个人学习VC的后来人少走一些弯路!!!!
说细一点就是对初学者最大的帮助。前提是你要回怎么弄出一个基于对话框的程序。打开VC,
新建,基于MFC的.EXE文档。一般都是用默认。最后是确定!系统弹出一个信息框。这样就依靠系统,产生了一个小程序了。。。
下面把上面的一切控件删除了,我们自己弄控件吧。。
往上面拖动两个按钮,
名字也不用改了,我们要的是右键的效果啊……下面是为这个321对话框添加右键响应函数。Ctrl+W打开类向导对话框。(选择主对话框。这里只有一个对话框,就不用考虑那么多了。) 对对话框添加函数WM_CONTEXTMENU。
单击响应函数,在下面的函数中会显示出来,双击那个函数,系统弹出函数对话框,使用默认的函数名即可。
系统添加的函数如下所示:
下面就可以把我在网上搜到的成品代码添加进这个函数里了。
代码如下:
void CMy321Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
VERIFY(menu.LoadMenu(IDM_LISTBOXPOPUP));//加载菜单资源
CMenu* pPopup="menu".GetSubMenu(0);
ASSERT(pPopup!=NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);
//在鼠标当前位置弹出菜单
}
下面该是说右键快捷菜单的时候了……,在VC的窗口左侧选择ResourcesView选项卡。右击弹出的菜单中选择插入……(I)。
点击插入后弹出下面的对话框:
下面我们就要对这个新加入的菜单进行添加菜单项了……双击这个资源,就进入了资源的编辑了。
弄完了右键的菜单,下面我们就把它变成真正的右键菜单吧……,返回到程序界面,找到我们刚才插入进去的那段函数,把里面的改为
然后就可以进行编译和运行了……
结果第一次编译就出现了错误,错误在第一行上,是什么Debug no such file 什么 的 ,我给忘了,解决的办法就是找到工程所在的文件夹,把Debug文件夹下的文件全部删除……就可以了。。。(以后会把错误完善)。
编译成功之后就可以看到效果了……哈哈,右键可以使用并弹出了快捷菜单了……效果我没法贴出来。大家可以发现,在对话框里的任何地方都是一样的快捷菜单。这就是我们上面使用的那种,对所有的控件都是一样的快捷菜单。如果是有文字处理的地方怎么办呢?我们还要复制和粘贴啊……
不要紧,下面的程序,就是针对不同的控件,弹出不同的快捷菜单,不过,那你可就要准备出一大堆菜单资源做准备了哦……
void CMyFileDlg::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
CRect rect;//定义矩形区域
GetDlgItem(IDL_FILE)->GetWindowRect(&rect);//获取控件区域的矩形
if(rect.PtInRect(point))
{
CMenu menu;
VERIFY(menu.LoadMenu(IDM_FILEPOPUP));
CMenu* pPopup="menu".GetSubMenu(0);
ASSERT(pPopup!=NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);
//在鼠标当前位置显示指定菜单
}
}
代码的解释如下:
在上面的程序中加入这段后,就可以针对某一个控件添加右键快捷菜单了……呵呵,当然,你还可以往程序里面加许多的控件响应函数,并对应不同的快捷菜单。
不过,我也是新手,了解并不是很多,想给对话框添加一个按钮,点击按钮就可以弹出另一个对话框,并给另一个对话框添加右键快捷菜单,但是,最后还是以失败告终。现在没有太多的时间去考虑这个,所以,这个想法就先放一放吧。顺便把跟菜单有关的函数和参数提供给大家。
使用弹出式菜单(PopMenu)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
弹出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。通常情况下,弹出式菜单在鼠标右键单击时弹出,当然,也可以根据需要随时弹出。 在VC++5的MFC中,管理菜单的类叫CMenu。下面我向大家介绍建立一个弹出式菜单的基本方法。
一、在资源编辑器中建立一个菜单资源
新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。至于每一个菜单项的消息映射,与一般的菜单相同。
二、使用CMenu类对象
CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。
1、LoadMenu函数
功能:从应用程序的可执行文件中加载菜单资源
原型:BOOL LoadMenu( UINT nIDResource );
其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。
2、GetSubMenu函数
功能:此函数用于得到子菜单的指针。
原型:CMenu* GetSubMenu( int nPos ) const;
nPos为层数,0为第一层子菜单……以此类推。
由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0)来得到第一层子菜单的类指针。
3、TrackPopupMenu函数
功能:在指定位置显示弹出菜单,并跟踪所选择的项
原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );
其中:
{
nFlags为屏幕坐标属性和鼠标坐标属性
屏幕坐标属性:
TPM_CENTERALIGN 横向将菜单以x居中
TPM_LEFTALIGN 横向将菜单以x左对齐
TPM_RIGHTALIGN 横向将菜单以x右对齐
鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效):
TPM_LEFTBUTTON 连续按鼠标右键不会连续弹出菜单,鼠标右键不可用于选定菜单项
TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项
x,y均为屏幕坐标
lpRect 菜单所占的区域。如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失
参考来源:
文章评论(0条评论)
登录后参与讨论