Visual-C++程序设计教程第五章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Visual-C++程序设计教程第五章.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C+ 程序设计 教程 第五
- 资源描述:
-
1、第5章 菜单和工具栏设计n5.1创建和编辑菜单n5.2 加速键n5.3 动态更改菜单n5.4 使用上下文菜单n5.5 工具栏设计n5.6 提高实例带有工具栏的画图程序5.1创建和编辑菜单n菜单是Windows应用程序中一个必不可少的用户界面资源,菜单的风格直接影响应用程序是否美观,所以设计菜单非常重要。而从编程的角度讲,菜单是应用程序中可操作命令的集合,体现了程序的功能,当选择某一菜单项时就会执行指定的程序代码,完成相应的功能。Visual C+集成开发环境提供了一个可视化菜单资源编辑器,用于菜单的编辑和添加,使用起来非常方便。5.1.1定义菜单n1.菜单资源编辑器n在创建一个SDI单文档应用
2、程序后,在项目工作区的Resource View页面中选择Menu并展开,然后双击下面的IDR_MAINFRAME项就会弹出菜单资源编辑器,显示应用程序向导所创建的菜单资源,如图51所示。空白主菜单项子菜单项主菜单项空白子菜单项图5-1 菜单资源 从上图可以看出默认生成的主菜单共包含四个主菜单项,分别实现不同的功能,每个主菜单下都分别包含和该菜单相关联的子菜单。用户在实现特定功能的时候需要添加新的菜单命令,可以添加在图中“空白主菜单项”或者“空白子菜单项”的位置,分别表示主菜单功能或者某主菜单下的下一级子菜单功能。2添加菜单项添加菜单项 在打开菜单资源编辑器以后,就可以为程序添加自己的菜单项了
3、,方法是直接用鼠标右键单击图5-1中的“空白菜单项”部分,然后从弹出的快捷菜单中选择“Proterties”菜单命令,就可以弹出如图5-2所示的菜单属性对话框。灰色,不能输入子菜单,可输入ID图5-2 主菜单项属性对话框图5-3 子菜单项属性对话框 在该对话框中,用户可以根据需要设置菜单的属性,下表中给出各个属性的说明:属性标识说明ID菜单资源的身份标识标明菜单项显示的标题分割符设置分割子菜单项的分割线弹出设置菜单项是否弹出下级菜单非活动设置菜单的活动状态,选中后在程序运行时变灰,失效或不可选中断设为“列”时,菜单会以灰色条为界线,横排显示,无分割线的全部横排显示;设为“栏”时,功能与“列”相
4、同,但在横排显示的菜单之间加上一个竖直灰色分隔线已复选菜单项标题前打对勾已变灰菜单项显示为灰色帮助表示该菜单项为Help,并使该菜单项由右端起排列提示当菜单项被选择时,状态区上显示的帮助说明文字3菜单实例演示 例5-1:编写一个单文档应用程序MenuTest,为程序添加一个“测试”主菜单,并在其中添加“画圆”和“输出文本”两个菜单项。编程实现步骤说明:(1)利用MFC App Wizard向导生成单文档(SDI)应用程序MenuTest。在项目工作区的资源页面中选择Menu并展开,再双击IDR_MAINFRAME项弹出菜单资源编辑器,按图5-2添加“测试(&T)”主菜单,该菜单没有相应的ID标
5、识。(2)添加好主菜单后,就可以添加下一级子菜单了。回到菜单编辑器,在刚建好的主菜单“测试(&T)”下方双击带虚框的空白子菜单项,在属性对话框中添加子菜单“画圆(&C)tCtrl+D”,ID为“ID_DRAW_CIRCLE”,提示栏中输入程序运行时状态栏上的提示信息“在客户区中画一个圆”。按同样的步骤为菜单添加菜单项“输出文本(&T)tCtrl+T”,ID为“ID_OUTPUT_TEXT”,提示信息为“在客户区输出一行文字”,如图5-4所示。图5-4 添加子菜单项程序说明:程序说明:在步骤(2)中添加的菜单“画圆(&C)tCtrl+D”,“t”使后面的内容右对齐,Ctrl+D表明该菜单项的快捷
6、键,但此处仅起到提示作用,要真正成为快捷键还需要使用快捷键编辑器,在5-2节将详细介绍此功能。5.1.2编写菜单事件处理程序n1添加消息处理函数添加消息处理函数 在例5-1中,我们仅仅添加了菜单,并没有实现相应的菜单功能,即没有给菜单项添加消息处理函数,因此,添加的菜单项是灰色的,即处于不可用状态。这时可以利用Class Wizard类向导添加菜单命令的WM _COMMAND消息处理函数,在函数中添加代码完成对应的功能。下面给出对应菜单功能实现的具体步骤:(1)单击“查看|建立类向导”命令,或者使用快捷键“Ctrl+W”打开MFC ClassWizard对话框,单击“Message Maps”
7、选项卡,可以看到5个列表框。Project框列出当前工作区中的项目,Class name框列出当前项目的类,这两个框是下拉列表框;Object IDs框列出当前所有能接收消息的对象(ID),包括类、菜单项和控件;Messages框列出Object IDs框中选择的对象可处理的消息和重载的MFC虚函数;Member functions框列出当前已创建的消息处理函数,其中的“V”标记表示该函数是虚函数,“W”标记表示该函数是窗口消息处理函数。(2)在“Project”下拉列表框中选择“MenuTest”,在“Class name”下拉列表框中选择“CMenuTestView”。在“Object I
8、Ds”下拉列表框中选择要添加响应控件的ID,这里选择“ID_DRAW_CIRCLE”。在“Message”项中出现了两种类型的消息COMMAND(用于菜单命令)和UPDATE_COMMAND(用于更新菜单状态),这里我们选择的是COMMAND消息。单击“Add Function”按钮,再单击“OK”按钮就可以创建一个消息的处理函数OnDrawCircle(),创建好的“MFC ClassWizard”对话框如图5-5所示。图5-5 添加消息处理函数类向导对话框(3)按照同样的方法添加“输出文本(&T)tCtrl+T”菜单项的消息处理函数OnOutputText(),和步骤(2)一样,因为要在客
9、户区进行图形的绘制和文本的输出,所以将该消息映射函数映射到View类中。2消息处理函数映射机制消息处理函数映射机制 在完成通过“Class Wizard”添加了消息处理函数以后,就建立起了消息和处理函数的映射关系,用户不需要做太多的工作,实现起来是非常简单。那么对应于用户所做的操作,MFC自动为我们做了那些工作呢?主要有以下3个方面的内容:(1)在需要响应这个菜单命令的类的声明中添加一个响应函数的声明,针对例5-1,会在“CMenuTestView”类的头文件“MenuTestView.h”中添加如下所示的内容(加粗部分):protected:/AFX_MSG(CMenuTestView)af
10、x_msg void OnDrawCircle();afx_msg void OnOutputText();/AFX_MSGDECLARE_MESSAGE_MAP()(2)在该类的实现文件中,为这个类的消息映像表添加这个菜单的映像宏,针对该示例,会在“CMenuTestView”类的源文件“MenuTestView.cpp”中添加如下所示的内容(加粗部分):BEGIN_MESSAGE_MAP(CMenuTestView,CView)/AFX_MSG_MAP(CMenuTestView)ON_COMMAND(ID_DRAW_CIRCLE,OnDrawCircle)ON_COMMAND(ID_OU
11、TPUT_TEXT,OnOutputText)/AFX_MSG_MAP/Standard printing commandsON_COMMAND(ID_FILE_PRINT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:OnFilePrintPreview)END_MESSAGE_MAP()(3)在该类的实现中,添加消息响应函数的框架代码,用户只需要根据菜单的实际功能添加具体的实现代码就可以了。void CMenuTestVie
12、w:OnDrawCircle()/添加实现用户功能的程序代码void CMenuTestView:OnOutputText()/添加实现用户功能的程序代码程序说明:程序说明:采用消息映射宏处理消息时,要将所有的消息映射进行集中说明,在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。对菜单命令,向导自动添加的消息映射格式如下:ON_COMMAND(MenuItemID,MemberFunction)其中,参数MenuItemID是菜单项的ID标识,参数MemberFunction是处理该消息的成员函数名。通常情况下,默认消息处理函数名
13、是根据MenuItemID自动生成的,在该示例中,ID为“ID_DRAW_CIRCLE”的处理函数是“OnDrawCircle”,可以看到,是有On连接ID中的后两个单词构成的,注意每个单词首字母大写。n3函数功能具体实现函数功能具体实现n为了实现“画圆”和“输出文本”的功能,需要在消息处理函数框架中添加具体的程序代码(加粗部分)。nvoid CMenuTestView:OnDrawCircle()nn/TODO:Add your command handler code herenCClientDC dc(this);ndc.Ellipse(20,20,150,150);nnvoid CMe
14、nuTestView:OnOutputText()nn/TODO:Add your command handler code herenCClientDC dc(this);ndc.TextOut(200,200,这是一个菜单示例这是一个菜单示例);n程序说明:程序说明:该示例实现代码相对简单,首先定义了客户区设备环境类对象dc,然后通过调用该类的成员函数完成画圆和输出文本的功能。函数Ellipse()功能为绘制椭圆,第1,2个参数是椭圆外切矩形的左上角坐标,第3,4个参数是该外切矩形的右下角坐标。函数TextOut()功能是在指定的位置输出字符串,第1,2个参数是指定的坐标位置,第3个参数是
15、要输出的字符串。程序运行结果如图5-6所示。图5-6 程序运行结果5.1.3设置菜单的显示效果 在使用Class Wizard类向导为菜单项添加命令处理函数时(可参看图5-4),可以看到在Messages栏中除了WM_COMMAND消息,MFC应用程序的菜单项还有一个UPDATE_COMMAND_UI消息,它称为更新命令用户接口消息,专门用于处理菜单项和工具栏按钮的更新。每一个菜单命令都对应一个更新命令用户接口消息。可以为更新命令用户接口消息编写消息处理函数来处理用户接口的更新。有时一个菜单项可以有可用和不可用两种状态,即允许或禁止菜单项的使用(用于灰色状态)。例如,在例5-1中,如果想让“测
16、试”菜单下的“画圆”菜单项变为不可以使用的状态,则可以在Class Wizard窗口中(图5-4),在左边的Object IDs列表框中选择ID_DRAW_CIRCLE,在右边的Messages列表框中选择UPDATE_COMMAND_UI消息,添加消息处理函数。如图5-7所示。图5-7 添加UPDATE_COMMAND_UI处理函数图5-7 添加UPDATE_COMMAND_UI处理函数在生成的处理函数框架中添加如下代码(粗体显示):void CMenuTestView:OnUpdateDrawCircle(CCmdUI*pCmdUI)/TODO:Add your command updat
17、e UI handler code herepCmdUI-Enable(FALSE);运行程序后“画圆”菜单项变为灰色显示,处于不可用状态。提示提示:Enable()函数的参数为BOOL类型,当它的值为TRUE时,使菜单项可用;当其值为FALSE时,禁用菜单项。UPDATE_COMMAND_UI消息为程序员根据程序当前的运行情况对菜单项的状态进行动态设置提供了一个简便的方法,但该消息只适合菜单项,不适合顶层的主菜单。5.2 快捷键n快捷键和菜单是紧密联系在一起的,快捷键提供菜单执行的快捷方式,大大提高了用户的操作速度。快捷键通常是键盘上的一个键或几个键的组合,在程序设计中占据着重要的位置。5.
18、2.1 快捷键介绍在图形界面中,用户操作以鼠标为中心,虽然操作简单,但当执行某菜单命令时必须定位菜单位置,如果菜单分为多级,对操作熟练的用户而言,每次进行定位是一个烦琐费时的过程,因此直接使用加速键完成菜单功能给我们提供了极大的方便。加速键又称为键盘快捷键,可以将其理解为通常所说的组合快捷键,它为用户提供了一种快速执行菜单命令或其它某种功能的方法。加速键属于一种资源,可以在资源编辑器中编辑。在示例5-1中,我们添加了菜单项“画圆(&C)tCtrl+D”和“输出文本(&T)tCtrl+T”,这样在程序运行时显示菜单时同时也显示了菜单对应的加速键为“Ctrl+D”和“Ctrl+T”,如果加速键起作
19、用,直接按对应的加速键就可以实现画圆和输出文本的功能,更加的便利。5.2.2 定义加速键 利用MFC AppWizard生成的应用程序本身也带有一些加速键。比如,主框架窗口菜单就实现了New、Open和Save等菜单项的加速键(Ctrl+N、Ctrl+O、Ctrl+S)。用户除了可以对这些加速键进行修改外,还可以对自己添加的菜单项添加或者修改加速键。利用集成开发环境内置的加速键表编辑器可以方便的实现这些功能。打开例5-1编写的工程MenuTest,在项目工作区的资源页面(Resource View)中选择Accelerator并展开,再双击下面的IDR_MAINFRME,就打开了如图5-8所示
20、的加速键表。该表列出了当前应用程序的菜单项或者命令按钮ID以及相应的加速键。选择“插入|新建加速栏”或者在加速表编辑器的最底一列双击,会弹出加速键属性窗口。窗口中的字段说明如下:图5-8 加速键表编辑器 ID:可以选择或者输入菜单项的ID,针对该示例,输入“ID_DRAW_CIRCLE”。键:为加速键标识的键名,只要在这里输入字母或数字即可。如果是不可打印字符,比如Esc键,则必须使用虚拟键盘码。滚动该组合框就可以看到以“VK_”为前缀的键盘码。辅助键:可以选择加速键的修改键,默认的修改键是“ctrl”,用户可以根据需要选择不同的修改键。本示例中使用“ctrl”。类型:可以选用“ASCII”或
21、者“VirKey”。如果加速键中含有不可打印字符或者希望加速键在各种键盘上通用,使用VirKey。如果希望使用一些标点符号,则需要使用ASCII,注意ASCII区分大小写。本示例使用VirKey。5.2.3 创建加速键菜单提示 为了让用户知道菜单项对应的加速键,就需要在菜单显示时给出提示。在例5-1中我们定义的菜单“画圆(&C)tCtrl+D”和“输出文本(&T)tCtrl+T”就给出了明显的加速键提示。建立提示只需插入一个制表符(t)以及加速键名称。注意:某些情况下,加速键并不明显地对应菜单项选择。为了确保用户能够利用这些加速键,应该添加一个帮助数据库条目。5.3 动态更改菜单n一般情况下,
22、对菜单操作时,已经静态地在菜单编辑器中预先把菜单创建出来了。不过,对菜单进行的任何修改也可以在运行时动态地进行显示。MFC提供了一个菜单类CMenu,以支持对菜单的动态操作。5.3.1 CMenu类n1CreateMenu方法 该方法用于创建一个菜单窗口,并将其关联到菜单对象上。BOOL CreateMenu();返回值:执行成功,返回值为非零,否则为零。2CreatePopupMenu方法 该方法用于创建一个弹出式菜单窗口,并将其关联到菜单对象上。BOOL CreatePopupMenu();返回值:执行成功,返回值为非零,否则为零。对于弹出式菜单,如果菜单窗口被释放,菜单对象将自动释放。3
23、LoadMenu方法 该方法用于从应用程序的可执行文件中加载一个菜单资源,将其关联到菜单对象上。BOOL LoadMenu(LPCTSTR lpszResourceName);BOOL LoadMenu(UINT nIDResource);lpszResourceName标识资源名称;nIDResource标识资源ID。返回值:执行成功,返回值为非零,否则为零。4DeleteMenu方法 该方法用于从菜单中删除一个菜单项。BOOL DeleteMenu(UINT nPosition,UINT nFlags);nPosition标识某一个菜单项;nFlags表示如何解释nPosition,可选值
24、如下:(1)MF_BYCOMMAND 根据nPosition标识的菜单ID删除菜单项。(2)MF_BYPOSITION根据nPosition标识的菜单位置删除菜单项。5GetSubMenu方法 该方法用于获取弹出式菜单中的一个菜单项。CMenu*GetSubMenu(int nPos)const;nPos标识菜单项位置,第一个菜单项对应的位置识0,第二个菜单项对应的位置识1,依此类推。6InsertMenu方法 该方法用于向菜单指定位置插入菜单项。BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszN
25、ewItem=NULL);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);nPosition标识某一个菜单项;nFlags用法同DeleteMenu方法相同;nIDNewItem标识菜单项的ID;lpszNewItem标识菜单项的内容;pBmp标识关联菜单项的位图对象指针。7ModifyMenu方法方法 该方法用于修改菜单项信息。BOOL ModifyMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewIte
展开阅读全文