【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3099|回复: 0

快捷菜单-vc++编程指南

[复制链接]
发表于 2006-1-13 11:03:18 | 显示全部楼层 |阅读模式
3.8 快捷菜单<BR><BR>  Windows95和Windows 3.x在界面上的一个重大差别就是Windows95增加了功能强大的右键快捷菜单。在任何一个对象上按鼠标右键,就会弹出一个与所选当前对象相关的菜单,菜单中列出了一组针对当前对象的操作。在Visual Studio中就有大量这样的菜单。比如,在项目工作区中单击右键时弹出菜单,让用户选择Docking View(停泊视图)、Hide(隐藏)和Properties(属性)操作。现在我们来讨论如何使用Visual C++为应用程序增加右键菜单。<BR>  这里我们也不是手工编程,而是使用Visual Studio提供的构件工具Component Gallery(组件画廊)向框架窗口添加快捷菜单。有关Componet Gallery的概念参见第二课2.1.5节。选择Project-&gt;Add to Project-&gt;Component and Controls菜单,弹出Component and Controls Gallery对话框,选择Developer Studio Components目录,在该目录下选择Popup Menu构件,如图3-15所示。<BR>&gt;<BR>按Insert按钮。弹出Poup Menu对话框,在Add popup menu to下拉列表框中选择CMainFrame,点OK按钮,关闭Popup Menu对话框。按Close按钮关闭Component and Controls Gallery对话框。编译运行Hello,弹出窗口后按右键,就弹出如图3-16所示的快捷菜单。菜单中包含三项:cut、copy、paste。因为没有对应的消息矗立函数,所有这些菜单都是灰色的、非活动的。<BR>按Insert按钮。弹出Poup Menu对话框,在Add popup menu to下拉列表框中选择CMainFrame,点OK按钮,关闭Popup Menu对话框。按Close按钮关闭Component and Controls Gallery对话框。编译运行Hello,弹出窗口后按右键,就弹出如图3-16所示的快捷菜单。菜单中包含三项:cut、copy、paste。因为没有对应的消息矗立函数,所有这些菜单都是灰色的、非活动的。<BR>&gt;<BR>现在,我们看看Component Gallery是如何实现快捷菜单的。首先看资源视图的菜单资源,Component Gallery在其中增加了一个ID为CG_IDR_POPUP_MAIN_FRAME的菜单,菜单中包含了刚才我们看到的三个菜单项:cut、copy、paste。切换到类视图,浏览CMainFrame类,可以看到CMainFrame增加了一个OnContextMenu的成员函数,它是CWnd的一个方法,用于处理鼠标右键单击消息,原型如下:<BR><BR>afx_msg void OnContextMenu(CWnd* pWnd,CPoint point);<BR><BR>  其中pWnd指向右键单击的窗口,它可以是一个本窗口的一个子窗口。比如,我们在工具条上单击右键时也弹出同样的菜单,工具条就是框架窗口的一个子窗口。OnContextMenu函数定义如清单3.6所示。<BR><BR>清单3.6 右键菜单<BR><BR>void CMainFrame::OnContextMenu(CWnd*, CPoint point)<BR><BR>{<BR><BR>// CG: This block was added by the Pop-up Menu component<BR><BR>{<BR><BR>if (point.x == -1 &amp;&amp; point.y == -1){<BR><BR>//如果是键盘激活的快捷菜单,则在窗口左上角5,5的位置显示快捷菜单<BR><BR>CRect rect;<BR><BR>GetClientRect(rect);<BR><BR>ClientToScreen(rect);<BR><BR>point = rect.TopLeft();<BR><BR>point.Offset(5, 5);<BR><BR>}<BR><BR>//载入快捷菜单资源<BR><BR>CMenu menu;<BR><BR>VERIFY(menu.LoadMenu(CG_IDR_POPUP_MAIN_FRAME));<BR><BR>//取得本菜单的第一个子菜单<BR><BR>CMenu* pPopup = menu.GetSubMenu(0);<BR><BR>ASSERT(pPopup != NULL);<BR><BR>CWnd* pWndPopupOwner = this;<BR><BR>//如果当前窗口是一个子窗口,取其父窗口作为弹出菜单的拥有者<BR><BR>while (pWndPopupOwner-&gt;GetStyle() &amp; WS_CHILD)<BR><BR>pWndPopupOwner = pWndPopupOwner-&gt;GetParent();<BR><BR>//在point.x,point.y处显示弹出式菜单并跟踪其选择项<BR><BR>pPopup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,pWndPopupOwner);<BR><BR>}<BR><BR>}<BR><BR>  一般的,我们都可以使用Component Gallery的Popup menu构件为某个窗口、对话框、视图等增加快捷菜单而无需手工编程。我们要做的只是编辑修改缺省的菜单为我们自己的快捷菜单,并用ClassWizard生成必要的成员函数,在加入自己的代码。如果确实要手工做的话,首先应当用菜单编辑器增加一个菜单,然后为对应的窗口添加OnContextMenu方法,OnContextMenu的定义可以参考上面的程序。<BR>  Component Gallery的功能远不止向程序添加快捷菜单这一项,它还可以增加启动画面(Splash Window)、多页式对话框、口令检查对话框等多种功能。读者可以试着往Hello程序中添加Splash Window和口令对话框,体验一下Component Gallery的强大功能。<BR><BR>小 结<BR><BR>在这一章里,我们主要向读者介绍:<BR><BR>如何使用AppWizard生成Hello框架程序,并手工修改代码,让窗口显示 “Hello,World!”,并介绍了AppWizard所生成的文件。<BR><BR>应用程序的执行机制:框架调用缺省的WinMain函数,首先执行InitInstance初始化应用程序类的一个实例,然后调用Run进入消息循环。<BR><BR>框架窗口的使用:包括窗口的创建、注册类、窗口的关闭和撤消。<BR><BR>在窗口中加入菜单,分为三步工作:第一步,用菜单编辑器编辑菜单;第二步,用ClassWizard生成消息处理函数;第三步,手工编辑消息处理函数,完成特定的功能。<BR><BR>用户接口更新消息:接口更新机制原理,如何控制菜单的使能、灰化、选中。<BR><BR>快捷菜单编程:使用Component Gallery给应用程序添加快捷菜单.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 03:05

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表