原创 怎样添加右键快捷菜单

2010-6-14 20:58 6704 5 5 分类: 软件与OS

怎样添加右键快捷菜单    


作者:济南职业学院 电子系 朱志强    时间:   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++5MFC中,管理菜单的类叫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 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项


xy均为屏幕坐标
lpRect
菜单所占的区域。如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失



参考来源:


http://huigezrx.blog.163.com/blog/#m=0&t=1&c=fks_087068081082089074086087081095087084080067085080083065


文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条