Visual-C++程序设计教程第五章

PPT
  • 阅读 91 次
  • 下载 0 次
  • 页数 127 页
  • 大小 986.000 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
Visual-C++程序设计教程第五章
可在后台配置第一页与第二页中间广告代码
Visual-C++程序设计教程第五章
可在后台配置第二页与第三页中间广告代码
Visual-C++程序设计教程第五章
可在后台配置第三页与第四页中间广告代码
Visual-C++程序设计教程第五章
Visual-C++程序设计教程第五章
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 127
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】Visual-C++程序设计教程第五章.ppt,共(127)页,986.000 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2473.html

以下为本文档部分文字说明:

第5章菜单和工具栏设计◼5.1创建和编辑菜单◼5.2加速键◼5.3动态更改菜单◼5.4使用上下文菜单◼5.5工具栏设计◼5.6提高实例――带有工具栏的画图程序5.1创建和编辑菜单◼菜单是Windows应用程序中一个必不可少的用户界面资源,菜

单的风格直接影响应用程序是否美观,所以设计菜单非常重要。而从编程的角度讲,菜单是应用程序中可操作命令的集合,体现了程序的功能,当选择某一菜单项时就会执行指定的程序代码,完成相应的功能。VisualC++集成开发环境提供了一个可视化菜单资源编

辑器,用于菜单的编辑和添加,使用起来非常方便。5.1.1定义菜单◼1.菜单资源编辑器◼在创建一个SDI单文档应用程序后,在项目工作区的ResourceView页面中选择Menu并展开,然后双击下面的ID

R_MAINFRAME项就会弹出菜单资源编辑器,显示应用程序向导所创建的菜单资源,如图51所示。空白主菜单项子菜单项主菜单项空白子菜单项图5-1菜单资源从上图可以看出默认生成的主菜单共包含四个主菜单项,分别实现不同的功能,每个主菜单下都分别包含和该菜单相关联的子菜单。用户在实现特定功

能的时候需要添加新的菜单命令,可以添加在图中“空白主菜单项”或者“空白子菜单项”的位置,分别表示主菜单功能或者某主菜单下的下一级子菜单功能。2.添加菜单项在打开菜单资源编辑器以后,就可以为程序添加自己的菜单项了,方法是直接用鼠标右键单

击图5-1中的“空白菜单项”部分,然后从弹出的快捷菜单中选择“Proterties”菜单命令,就可以弹出如图5-2所示的菜单属性对话框。灰色,不能输入子菜单,可输入ID图5-2主菜单项属性对话框图5-3子菜单项属性对话框在该对话框中,用户可以根据需要设置菜单的属性,下表中给出各个

属性的说明:属性标识说明ID菜单资源的身份标识标明菜单项显示的标题分割符设置分割子菜单项的分割线弹出设置菜单项是否弹出下级菜单非活动设置菜单的活动状态,选中后在程序运行时变灰,失效或不可选中断设为“列

”时,菜单会以灰色条为界线,横排显示,无分割线的全部横排显示;设为“栏”时,功能与“列”相同,但在横排显示的菜单之间加上一个竖直灰色分隔线已复选菜单项标题前打对勾已变灰菜单项显示为灰色帮助表示该菜单项为Help,并使该菜单项

由右端起排列提示当菜单项被选择时,状态区上显示的帮助说明文字3.菜单实例演示例5-1:编写一个单文档应用程序MenuTest,为程序添加一个“测试”主菜单,并在其中添加“画圆”和“输出文本”两个菜单项。编程实现步骤说明:(1)利用MFCAppWizard向导生成单文档(SDI)应

用程序MenuTest。在项目工作区的资源页面中选择Menu并展开,再双击IDR_MAINFRAME项弹出菜单资源编辑器,按图5-2添加“测试(&T)”主菜单,该菜单没有相应的ID标识。(2)添加好主菜单后,就可以添加下一级子菜单了。回到菜单编辑器,在刚建好的主菜单“测试(&T

)”下方双击带虚框的空白子菜单项,在属性对话框中添加子菜单“画圆(&C)\tCtrl+D”,ID为“ID_DRAW_CIRCLE”,提示栏中输入程序运行时状态栏上的提示信息“在客户区中画一个圆”。按同样的步骤

为菜单添加菜单项“输出文本(&T)\tCtrl+T”,ID为“ID_OUTPUT_TEXT”,提示信息为“在客户区输出一行文字”,如图5-4所示。图5-4添加子菜单项程序说明:在步骤(2)中添加的菜单“画圆(&C)\tCt

rl+D”,“\t”使后面的内容右对齐,Ctrl+D表明该菜单项的快捷键,但此处仅起到提示作用,要真正成为快捷键还需要使用快捷键编辑器,在5-2节将详细介绍此功能。5.1.2编写菜单事件处理程序◼1.添加消息处理函数在

例5-1中,我们仅仅添加了菜单,并没有实现相应的菜单功能,即没有给菜单项添加消息处理函数,因此,添加的菜单项是灰色的,即处于不可用状态。这时可以利用ClassWizard类向导添加菜单命令的WM_COMMAND消息处理函数,在函数中添加代码完

成对应的功能。下面给出对应菜单功能实现的具体步骤:(1)单击“查看|建立类向导…”命令,或者使用快捷键“Ctrl+W”打开MFCClassWizard对话框,单击“MessageMaps”选项卡,可以看到5个列表框。Project框列出当前工作

区中的项目,Classname框列出当前项目的类,这两个框是下拉列表框;ObjectIDs框列出当前所有能接收消息的对象(ID),包括类、菜单项和控件;Messages框列出ObjectIDs框中选择的对象可处理的消息和重载的MFC虚函数;Memberfunctions框列出当前已创建的消息

处理函数,其中的“V”标记表示该函数是虚函数,“W”标记表示该函数是窗口消息处理函数。(2)在“Project”下拉列表框中选择“MenuTest”,在“Classname”下拉列表框中选择“CMenuTestView”。在“ObjectIDs”下拉列表框中选择要添加响

应控件的ID,这里选择“ID_DRAW_CIRCLE”。在“Message”项中出现了两种类型的消息COMMAND(用于菜单命令)和UPDATE_COMMAND(用于更新菜单状态),这里我们选择的是COMMAND消息。单击“AddFunction…”按钮,再单击“OK”按钮就可以创建一

个消息的处理函数OnDrawCircle(),创建好的“MFCClassWizard”对话框如图5-5所示。图5-5添加消息处理函数类向导对话框(3)按照同样的方法添加“输出文本(&T)\tCtrl+T”菜单项的消息处理函数OnOutputText

(),和步骤(2)一样,因为要在客户区进行图形的绘制和文本的输出,所以将该消息映射函数映射到View类中。2.消息处理函数映射机制在完成通过“ClassWizard”添加了消息处理函数以后,就建立起了消息

和处理函数的映射关系,用户不需要做太多的工作,实现起来是非常简单。那么对应于用户所做的操作,MFC自动为我们做了那些工作呢?主要有以下3个方面的内容:(1)在需要响应这个菜单命令的类的声明中添加一个响应函数的声明,针对例5-1,会在“CMenuTestView”类的头文件“MenuT

estView.h”中添加如下所示的内容(加粗部分):protected://{{AFX_MSG(CMenuTestView)afx_msgvoidOnDrawCircle();afx_msgvoidOnOutputText();//}}AFX_MSGDECLARE_MESSAGE_MAP

()(2)在该类的实现文件中,为这个类的消息映像表添加这个菜单的映像宏,针对该示例,会在“CMenuTestView”类的源文件“MenuTestView.cpp”中添加如下所示的内容(加粗部分):BEGIN_MESSAGE_MAP(CMenuTes

tView,CView)//{{AFX_MSG_MAP(CMenuTestView)ON_COMMAND(ID_DRAW_CIRCLE,OnDrawCircle)ON_COMMAND(ID_OUTPUT_TEXT,OnOutputText)//}}AFX_MSG_M

AP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePr

int)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()(3)在该类的实现中,添加消息响应函数的

框架代码,用户只需要根据菜单的实际功能添加具体的实现代码就可以了。voidCMenuTestView::OnDrawCircle(){//添加实现用户功能的程序代码}voidCMenuTestView::OnOutputText(){//添加实现用户功能的程序代码}程序说

明:采用消息映射宏处理消息时,要将所有的消息映射进行集中说明,在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。对菜单命令,向导自动添加的消息映射格式如下:ON_COMMAND(MenuItemID,MemberF

unction)其中,参数MenuItemID是菜单项的ID标识,参数MemberFunction是处理该消息的成员函数名。通常情况下,默认消息处理函数名是根据MenuItemID自动生成的,在该示例中,ID为“ID_DRAW_CIRCLE”的处理函数是“OnDrawCircle”,可以看到,是

有On连接ID中的后两个单词构成的,注意每个单词首字母大写。◼3.函数功能具体实现◼为了实现“画圆”和“输出文本”的功能,需要在消息处理函数框架中添加具体的程序代码(加粗部分)。◼voidCMenuTestView::OnDrawC

ircle()◼{◼//TODO:Addyourcommandhandlercodehere◼CClientDCdc(this);◼dc.Ellipse(20,20,150,150);◼}◼voidCMenuTestView::OnOutputTe

xt()◼{◼//TODO:Addyourcommandhandlercodehere◼CClientDCdc(this);◼dc.TextOut(200,200,"这是一个菜单示例");◼}程序说明:该示例实现代码相对简单,首先定义了客户区设备环境

类对象dc,然后通过调用该类的成员函数完成画圆和输出文本的功能。函数Ellipse()功能为绘制椭圆,第1,2个参数是椭圆外切矩形的左上角坐标,第3,4个参数是该外切矩形的右下角坐标。函数TextOut()功能是在指定的位置输

出字符串,第1,2个参数是指定的坐标位置,第3个参数是要输出的字符串。程序运行结果如图5-6所示。图5-6程序运行结果5.1.3设置菜单的显示效果在使用ClassWizard类向导为菜单项添加命令处理函数时(可参看图5-4),可

以看到在Messages栏中除了WM_COMMAND消息,MFC应用程序的菜单项还有一个UPDATE_COMMAND_UI消息,它称为更新命令用户接口消息,专门用于处理菜单项和工具栏按钮的更新。每一个菜单命令都

对应一个更新命令用户接口消息。可以为更新命令用户接口消息编写消息处理函数来处理用户接口的更新。有时一个菜单项可以有可用和不可用两种状态,即允许或禁止菜单项的使用(用于灰色状态)。例如,在例5-1中,如果想让“测试”菜单下的“画圆”菜单项变为不可以使用的状态,则可以在

ClassWizard窗口中(图5-4),在左边的ObjectIDs列表框中选择ID_DRAW_CIRCLE,在右边的Messages列表框中选择UPDATE_COMMAND_UI消息,添加消息处理函数。如图5-7所示。图5-7添加UPDATE_COMMAND_U

I处理函数图5-7添加UPDATE_COMMAND_UI处理函数在生成的处理函数框架中添加如下代码(粗体显示):voidCMenuTestView::OnUpdateDrawCircle(CCmdUI*pCmdUI){//TODO:Addyourcommandupda

teUIhandlercodeherepCmdUI->Enable(FALSE);}运行程序后“画圆”菜单项变为灰色显示,处于不可用状态。提示:Enable()函数的参数为BOOL类型,当它的值为TRUE时,使菜单项可用;当其值为FA

LSE时,禁用菜单项。UPDATE_COMMAND_UI消息为程序员根据程序当前的运行情况对菜单项的状态进行动态设置提供了一个简便的方法,但该消息只适合菜单项,不适合顶层的主菜单。5.2快捷键◼快捷键和菜单是紧密联系在一起的,快捷键提供菜单执行的

快捷方式,大大提高了用户的操作速度。快捷键通常是键盘上的一个键或几个键的组合,在程序设计中占据着重要的位置。5.2.1快捷键介绍在图形界面中,用户操作以鼠标为中心,虽然操作简单,但当执行某菜单命令时必须定位菜单位置,如果菜单分为多级,对操作熟练的用户而言,每次进行定位是一个烦琐费时的过程,因此

直接使用加速键完成菜单功能给我们提供了极大的方便。加速键又称为键盘快捷键,可以将其理解为通常所说的组合快捷键,它为用户提供了一种快速执行菜单命令或其它某种功能的方法。加速键属于一种资源,可以在资源编辑器中编辑。在示例5-1中,我们添加了菜单

项“画圆(&C)\tCtrl+D”和“输出文本(&T)\tCtrl+T”,这样在程序运行时显示菜单时同时也显示了菜单对应的加速键为“Ctrl+D”和“Ctrl+T”,如果加速键起作用,直接按对应的加速键就可以实现画圆和输出文本的功能,更加的便利。5.2.2定义加速键利用MFCApp

Wizard生成的应用程序本身也带有一些加速键。比如,主框架窗口菜单就实现了New、Open和Save等菜单项的加速键(Ctrl+N、Ctrl+O、Ctrl+S)。用户除了可以对这些加速键进行修改外,还可以对自己添加的菜单项添加或者修改加速

键。利用集成开发环境内置的加速键表编辑器可以方便的实现这些功能。打开例5-1编写的工程MenuTest,在项目工作区的资源页面(ResourceView)中选择Accelerator并展开,再双击下面的IDR_MAINFRME,就打开

了如图5-8所示的加速键表。该表列出了当前应用程序的菜单项或者命令按钮ID以及相应的加速键。选择“插入|新建加速栏”或者在加速表编辑器的最底一列双击,会弹出加速键属性窗口。窗口中的字段说明如下:图5-8加速键表编辑器ID:可以选择或者输入菜单项的ID

,针对该示例,输入“ID_DRAW_CIRCLE”。键:为加速键标识的键名,只要在这里输入字母或数字即可。如果是不可打印字符,比如Esc键,则必须使用虚拟键盘码。滚动该组合框就可以看到以“VK_”为前缀的键盘码。辅助键:可以选择加速

键的修改键,默认的修改键是“ctrl”,用户可以根据需要选择不同的修改键。本示例中使用“ctrl”。类型:可以选用“ASCII”或者“VirKey”。如果加速键中含有不可打印字符或者希望加速键在各种键盘上通用,使用VirKey。如果希望使用一些标点符号,则需要使用ASCII,注意ASCI

I区分大小写。本示例使用VirKey。5.2.3创建加速键菜单提示为了让用户知道菜单项对应的加速键,就需要在菜单显示时给出提示。在例5-1中我们定义的菜单“画圆(&C)\tCtrl+D”和“输出文本(&T)\tCtrl+T”就给出了明显的加速键提示。建立提示只需插入一个制表符(\t)

以及加速键名称。注意:某些情况下,加速键并不明显地对应菜单项选择。为了确保用户能够利用这些加速键,应该添加一个帮助数据库条目。5.3动态更改菜单◼一般情况下,对菜单操作时,已经静态地在菜单编辑器中预先把菜单创建出来了。不过,对菜单进行的任何修改也可以在运行时动态地进行显示。MFC提供

了一个菜单类CMenu,以支持对菜单的动态操作。5.3.1CMenu类◼1.CreateMenu方法该方法用于创建一个菜单窗口,并将其关联到菜单对象上。BOOLCreateMenu();返回值:执行成功,返回值为非零,否则为零。2.CreatePopupMenu方法该方法用于创建一个弹出

式菜单窗口,并将其关联到菜单对象上。BOOLCreatePopupMenu();返回值:执行成功,返回值为非零,否则为零。对于弹出式菜单,如果菜单窗口被释放,菜单对象将自动释放。3.LoadMenu方法该方法用于从应用程序的可执行文件中加载一个菜

单资源,将其关联到菜单对象上。BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UINTnIDResource);lpszResourceName标识资源名称;nIDResource

标识资源ID。返回值:执行成功,返回值为非零,否则为零。4.DeleteMenu方法该方法用于从菜单中删除一个菜单项。BOOLDeleteMenu(UINTnPosition,UINTnFlags);nPosition标识某

一个菜单项;nFlags表示如何解释nPosition,可选值如下:(1)MF_BYCOMMAND根据nPosition标识的菜单ID删除菜单项。(2)MF_BYPOSITION根据nPosition标识的菜单位置删除菜单项。5.Get

SubMenu方法该方法用于获取弹出式菜单中的一个菜单项。CMenu*GetSubMenu(intnPos)const;nPos标识菜单项位置,第一个菜单项对应的位置识0,第二个菜单项对应的位置识1,依此类推。6.Insert

Menu方法该方法用于向菜单指定位置插入菜单项。BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=

NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);nPosition标识某一个菜单项;nFlags用法同DeleteMenu方法相同;nIDNew

Item标识菜单项的ID;lpszNewItem标识菜单项的内容;pBmp标识关联菜单项的位图对象指针。7.ModifyMenu方法该方法用于修改菜单项信息。BOOLModifyMenu(UINTnPosition,UINTnF

lags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLModifyMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);各参数的作用同InsertMenu方法

相同。8.AppendMenu方法该方法实现在菜单项的末尾添加一个新菜单。BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);B

OOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);nFlags标识菜单项的状态信息;nIDNewItem标识菜单项的ID;lpszNewItem标识菜单项的内容;pBmp标识关联菜单项的位图对象指针。9.DrawItem方法该方

法识一个虚方法,用户可以改写该方法实现菜单的绘制。如果菜单设置成可以自绘类型,则这个函数将在生成菜单、弹出菜单、选中菜单、点击菜单等时由系统框架调用。它可以帮你绘制出各种样式的菜单。VirtualvoidDrawItem(LP

DRAWITEMSTRUCTlpDrawItemStruct);lpDrawItemStruct是一个DRAWITEMSTRUCT结构指针,DRAWITEMSTRUCT结构包含了菜单项的ID、类型、画布、句柄等详细信息。除了上面介绍的函数之外,CMenu类还有很多有用的函数,有兴趣

的读者可以查阅相关资料。5.3.2动态更改菜单项在示例5-1中我们对菜单操作时,已经静态地在菜单编辑器中预先把菜单创建出来,有时为了程序实现功能的需要,也可以在程序运行的过程中,动态的进行修改。1.添加菜单项

目要实现在程序运行时动态的添加菜单项目,主要利用了前面讲到的CMenu类的AppendMenu来完成,这个函数的作用是把一个新的菜单项目添加到一个指定菜单项目的末尾。这里详细给出该函数第一个参数nFl

ags的可取值以及作用:◼MF_CHECKED:菜单项显示选中标记◼MF_SEPARATOR:菜单项是一个分隔栏项◼MF_ENABLED:使菜单项可用◼MF_GRAYED:禁用菜单项并加灰显示◼MF_OWNERDRAW:菜单项内容由应用

程序绘制,可以定制样式更加丰富的菜单项◼MF_POPUP:弹出式菜单◼MF_STRING:使用一个字符串标识该菜单项目◼MF_MENUBREAK:更改菜单项的显示方式◼MF_MENUBARBREAK:更改菜单项的显示方式,但在菜单项之间显示分割

线下面我们结合一个实例来学习动态添加菜单项的方法。例5-2:在例5-1菜单中添加主菜单项“动态修改菜单”,并添加一个子菜单项“增加菜单”,ID为ID_ADD_MENU,要求当单击该菜单项时,动态的添加一个菜单项“动态菜单”,要求该菜单项和“增加菜单

”之间有一条分割线。编程实现步骤说明:(1)在项目工作区的资源页面中选择Menu并展开,再双击IDR_MAINFRAME项弹出菜单资源编辑器,增加如题目要求的菜单项“动态修改菜单”和“增加菜单”。(2)

使用ClassWizard为菜单项ID_ADD_MENU映射函数。在CMenuTestView类中为其添加“ON_COMMAND”消息响应函数OnAddMenu()和“ON_UPDATE_COMMAND_UI”消息响应函数OnUpdateAddMenu()。(3)添加动态生成的菜单项的ID资源

。单击“查看|资源符号…”命令弹出资源符号对话框,如图5-9所示,添加要动态生成菜单对应的ID,可以看到,所有的资源ID其实是一个可以唯一标识的整数值。图5-9资源符号对话框(4)为CMenuTestView类的头文件Me

nuTestView.h添加一个条件变量,用该变量控制“增加菜单”项的状态,当该菜单项执行后就使其无效。public:BOOLflagAdd;在MenuTestView.cpp文件的构造函数中进行初始化。CMen

uTestView::CMenuTestView(){//TODO:addconstructioncodehereflagAdd=true;}(5)在“增加菜单”的响应函数OnAddMenu()中添加代码:voidCMenuTestView::OnAddMenu(){//TODO:Addyourc

ommandhandlercodehereCWnd*pWnd=AfxGetApp()->GetMainWnd();//获得窗口指针CMenu*pMenu=pWnd->GetMenu();//获得Menu指针pMenu=pMenu->GetSubMenu(5);//获得菜单项"动态修改菜单"p

Menu->AppendMenu(MF_SEPARATOR);//增加分割符//增加菜单项"动态菜单",该菜单项对应ID_DYNAMIC_MENUpMenu->AppendMenu(MF_STRING,ID_DYNAMIC_MENU,"动态

菜单");flagAdd=false;//改变条件变量}在OnUpdateAddMenu()函数中修改“增加菜单”项的状态。voidCMenuTestView::OnUpdateAddMenu(CCmdUI*pCmdU

I){//TODO:AddyourcommandupdateUIhandlercodehereif(!flagAdd)//条件变量为false时pCmdUI->Enable(false);//使"增加菜单"无效}运行后单击“增加菜单”后该菜单项变灰显示,同时增加菜单项

“动态菜单”,由于该菜单项没有添加消息响应,也为灰色显示,如图5-10。图5-10动态增加菜单项在5.1.2节中详细讲了添加消息响应时MFC自动为我们完成了哪些工作,在动态菜单被添加后,我们不能按照以往的方法,通过ClassWizard添加响应了,只能够手工进行

添加消息映射代码。在头文件MenuTestView.h中声明菜单项“动态菜单”的响应函数OnDynamicMenu():...2.为动态添加的菜单项添加消息响应protected://{{AFX_MSG(CMenuTestView)afx_msgvoidOnDrawCircl

e();afx_msgvoidOnOutputText();afx_msgvoidOnUpdateDrawCircle(CCmdUI*pCmdUI);afx_msgvoidOnAddMenu();afx_msgvoidOnUpdateAddMenu(CCmdUI*

pCmdUI);afx_msgvoidOnDynamicMenu();//}}AFX_MSG...在源文件MenuTestView.cpp中建立消息映射并实现函数功能:◼BEGIN_MESSAGE_MAP(CMenuTest

View,CView)◼//{{AFX_MSG_MAP(CMenuTestView)◼ON_COMMAND(ID_DRAW_CIRCLE,OnDrawCircle)◼ON_COMMAND(ID_OUTP

UT_TEXT,OnOutputText)◼ON_UPDATE_COMMAND_UI(ID_DRAW_CIRCLE,OnUpdateDrawCircle)◼ON_WM_RBUTTONUP()◼ON_COMMAND(ID_ADD_MENU,OnAddMenu)◼ON_UPDATE_CO

MMAND_UI(ID_ADD_MENU,OnUpdateAddMenu)◼ON_COMMAND(ID_DYNAMIC_MENU,OnDynamicMenu)◼//}}AFX_MSG_MAP◼//Standardprintingcommands◼ON_COMM

AND(ID_FILE_PRINT,CView::OnFilePrint)◼ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)◼ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)

◼END_MESSAGE_MAP()◼...◼voidCMenuTestView::OnDynamicMenu()◼{◼AfxMessageBox("动态菜单测试成功!");//弹出消息框◼}运行后单击“动态菜单”项,弹出消息提示对话框,如图5-11

。图5-11运行成功消息提示对话框5.3.3动态添加菜单图标如果需要动态的为菜单项添加菜单图标,就要用到CMenu类的另一个成员函数SetMenuItemBitmaps,该函数可以方便地为菜单项添加图标,定义如下:BOOLSetMenuItemBitmaps(UINTnPosit

ion,UINTnFlags,constCBitmap*pBmpUnckecked,constCBitmap*pBmpChecked)第一个参数表示需要添加菜单图标的菜单项;第二个参数表示如何理解第一个参数:当参数为MF_BYCOMMAND时,第一个参数指的是菜

单项的ID;当参数为MF_BYPOSITION时,第一个参数指的是菜单项在菜单中的位置,索引值从0开始计算。第三个参数和第四个参数分别表示菜单项没选中和选中时的位图,如果希望该位图永远出现在菜单项前,则两个参数保持一致即可。例5-3:为例5-1中的“测试”菜单下的子菜单“画圆”和

“输出文本”添加菜单图标。编程实现步骤说明:(1)打开项目工作区的资源页面,单击“插入|资源...”菜单命令,弹出插入资源对话框,选中“Bitmap”后,单击“新建”按钮,则在资源页面中出现“Bitmap”项,并新建立一个位图,名称为

“IDB_BITMAP1”。图5-12IDB_CIRCLE图5-13IDB_TEXT(2)在此位图边框上的调整大小控制点上双击,会弹出该位图的属性对话框,将位图ID改为“IDB_CIRCLE”,并修改宽度和高度均为16,按照同样的方法添加位图“IDB_TEXT”,如图5-12

和图5-13。(3)在CMenuTestView类头文件“CMenuTestView.h”中添加两个CBitmap类型的成员变量m_bmpCircle和m_bmpText:private:CBitmapm_bmpCircle;CBitmapm_bmpText;在源文件“CMenuT

estView.cpp”中的构造函数中添加初始化代码如下:CMenuTestView::CMenuTestView(){//TODO:addconstructioncodehereflagAdd=true;m_bmpCircle.LoadBi

tmap(IDB_CIRCLE);m_bmpText.LoadBitmap(IDB_TEXT);}(4)在CMenuTestView类头文件“CMenuTestView.h”中添加两个CBitmap类型的成员变量m_bmpCircle和m_bmpText:private:CBitmapm_b

mpCircle;CBitmapm_bmpText;在源文件“CMenuTestView.cpp”中的构造函数中添加初始化代码如下:CMenuTestView::CMenuTestView(){//TODO:addconstr

uctioncodehereflagAdd=true;m_bmpCircle.LoadBitmap(IDB_CIRCLE);m_bmpText.LoadBitmap(IDB_TEXT);}运行程序后结果如图

5-14。图5-14添加菜单图标运行结果5.4使用上下文菜单◼菜单分为两类,除了前面讲的依附于框架窗口的一般菜单,另一类菜单是上下文菜单(也称为快捷菜单、浮动菜单)。当用户右击鼠标,上下文菜单就会出现在光标所在位置。在应用程序中添加上下文菜单的

过程比较简单,与普通菜单的添加过程相比有一些差别。一般添加上下文菜单的过程如下:(1)使用菜单模板编辑器定制上下文菜单模板,与普通菜单的定制方法相同。(2)添加菜单命令的消息响应函数,与普通菜单的添加方法相同。(3)在适当的位置添加载入并显示

菜单:需要手动添加相应的代码,实现菜单资源的载入与显示。5.4.1建立菜单资源建立菜单资源,即定制菜单模板和添加菜单命令的消息响应函数。上下文菜单的定制方法与普通菜单的定制相同,对于例5-1,我们可以直接利用做好的菜单资源“测试”以及它的两个下一级子菜单,如果希望弹出其他的

菜单实现不同的功能,可以参照该示例程序添加资源。为了右键单击后选择相应子菜单后能实现菜单功能,还要对菜单映射菜单命令处理函数,并根据需要编写具体的程序代码。5.4.2添加上下文菜单资源◼上下文菜单用于快捷地

访问当前可用的菜单项。当用户右击鼠标后,就会相应地弹出一个浮动的菜单,其菜单项内容由鼠标所指的对象指定。一般而言,弹出式(上下文)菜单是利用已有的菜单项来建立的,但也可以为上下文菜单专门创建一个菜单资源,然后通过调用类

CMenu类的成员函数LoadMenu()装入所创建的菜单资源,从而建立一个上下文菜单。(1)如果是利用已有的菜单项来建立的,当用户右击鼠标并释放后,将发送WM_CONTEXTMENU消息。因此,在程序中通过为WN_CONTEXTMENU添加消息处理函数来弹出上

下文菜单。在消息处理函数中,先装入菜单资源或添加菜单项,然后调用CMenu类的成员函数TackPopupMenu()显示弹出式菜单。WM_CONTEXTMENU消息是在收到WM_RTUTTONUP消息后由Windows产生的。WM_CONTEXTMENU消息处理函数使

用屏幕坐标,所以不用做任何的坐标转换,在什么位置右键单击上下文菜单就出现在什么位置。(2)如果为上下文菜单专门创建一个菜单资源,通过调用CMenu类的成员函数LoadMenu()装入所创建的菜单资源,那么WM_RBUTTONUP的消息处

理函数中不调用基类的处理函数,应用程序将不会收到WM_CONTEXTMENU消息。这是直接为WM_RBUTTONUP添加消息处理函数来弹出上下文菜单,要注意的是这时需要调用函数ClientToScreen()将客户区坐标转化为屏幕坐标。

方法(1)的程序实现代码如下:voidCMenuTestView::OnContextMenu(CWnd*pWnd,CPointpoint){//TODO:AddyourmessagehandlercodehereCMenumenuContext

;if(menuContext.CreatePopupMenu()){menuContext.AppendMenu(MF_STRING,ID_DRAW_CIRCLE,"画圆\tCtrl+D");menuContext.AppendMenu(MF_STRIN

G,ID_OUTPUT_TEXT,"输出文本\tCtrl+T");menuContext.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);}}方法(2)实现之前,要先建立一个新的菜单资源,这里建立一个和方法一种同样的菜单

资源,菜单的ID使用默认ID:IDR_MENU1,实现代码如下:voidCMenuTestView::OnRButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessag

ehandlercodehereand/orcalldefaultCMenumenuContext;CMenu*pSubMenu;menuContext.LoadMenu(IDR_MENU1);//载入菜单资源pSubMenu=menuContext.G

etSubMenu(0);//获得第一个菜单,这样效果和方法(1)相同this->ClientToScreen(&point);//客户区坐标转换成屏幕坐标pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point

.x,point.y,this);CView::OnRButtonUp(nFlags,point);}程序说明:函数AppendMenu()实现通过代码来动态的添加菜单项目,第1个参数指定加入菜单项的风格,值MF_STRING表示菜单项是一个字符串;第2个参数指定要加入的菜单项ID,如

ID_DRAW_CIRCLE;第3个参数指定菜单项的显示文本。函数TrackPopupMenu()用于在指定位置显示上下文菜单,并响应用户菜单项选择。函数第1个参数是位置标记,TPM_LEFTALIGN表示以

x为标准左对齐显示菜单;第2个、第3个参数指定上下文菜单的屏幕坐标;第4个参数指定拥有上下文菜单的窗口。程序运行结果如图5-15所示:图5-15上下文菜单运行结果5.5工具栏设计◼工具栏是一个完善的Wi

ndows应用程序的重要组成部分(但不是必需的部分),它一般位于主框架窗口的上部,上面有一些图形按钮。当用户单击某一按钮时,程序就会执行相应的命令。本节主要介绍工具栏的实现和使用方法。5.5.1创建和初始化工具栏◼工具栏是由一系列的按钮和

分隔符组成,并通过CToolBar类实现的,其父类为CControlBar。通常情况下,为了使工具栏可以更快捷、更有效地实现某些操作,应尽量使工具栏的命令ID与菜单和加速键的命令ID同步。在MFC中,工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的基本步

骤如下:(1)创建工具栏资源;(2)构建一个CToolBar对象;(3)调用CToolBar::Create()或CreateEx()函数创建工具栏窗口;(4)调用CToolBar::LoadToolBar载入工具栏资源。当用户使用MFCAppWiz

ard向导创建一个应用程序时,会自动创建一个默认的工具栏,这个工具栏包含一些常用按钮,如打开文件、存盘、打印等。用户可以修改这个工具栏,去掉无用的按钮,加入自己需要的按钮。如果用户需要创建两个以上的工具栏,则不能完全依赖AppWizard,需要自己手工创建。1.

工具栏资源编辑器创建工具栏资源或对已有的工具栏资源进行修改的方法非常简单,可以使用工具栏资源编辑器实现。打开项目工作区的资源页面(ResourceView),选择ToolBar并展开,再双击下面的IDR_MAINFRAME项就会弹出菜单资源编辑器,如图

5-16所示:可供修改的按钮显示效果工具栏按钮菜单资源图5-16工具栏资源编辑器(1)添加工具栏资源执行“插入|资源…”命令,在插入资源对话框中选择“工具栏”,单击“新建”按钮后,在上图资源页面的“Toolbar

”资源下就会出现一个ID为“IDR_TOOLBAR”的新资源。也可以直接在上图的“Toolbar”上右键单击,在弹出的上下文菜单中选择“插入工具栏”命令即可。(2)添加按钮单击空白按钮后,选择“查看|属性”菜单项,或者双击工具条上的空白按钮弹出如图5-17所示的工具栏

按钮属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。图5-17工具栏按钮属性对话框(3)删除按钮将按钮拖出工具栏外,即可删除该按钮。(4)编辑按钮位图可以利用绘图工具与调色板直接进行绘制,也可以先利用专用绘图软件制作,然后粘贴到按钮。提示:如果在编辑按钮位图的时候没有出现

“图形”和“颜色”工具栏,可以在DeveloperStudio的工具条的空白处单击鼠标右键,并在随之弹出的菜单中选中“图形”和“颜色”两项。2.创建初始化工具栏在MFC中,工具条的功能由类CToolBar实现。工具条实际上是主框架窗口的子窗口,因此

工具条对象应该依附于主框架窗口对象。在AppWizard创建的MFC程序中,主框架窗口的类名是CMainFrame,该类是MFC标准类CFrameWnd类的派生类。(1)创建工具栏窗口◼调用CToolBar::Create()或CreateEx()函数创建并初始化工具栏

窗口对象。若创建成功,函数返回TRUE,否则返回FALSE。函数的原型为:◼BOOLCreate(◼CWnd*pParentWnd,◼DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,◼UINTnID=AFX_ID

W_TOOLBAR◼);◼BOOLCreateEx(◼CWnd*pParentWnd,◼DWORDdwCtrlStyle=TBSTYLE_FLAT,◼DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP,◼CRectrcBorder

s=CRect(0,0,0,0),◼UINTnID=AFX_IDW_TOOLBAR◼);其中,参数pParentWnd为指向工具栏所在父窗口的指针,dwStyle为工具栏的风格,其取值为表5-2中参数的组合,nID表示工

具栏窗口的ID号。风格含义WS_VISIBLE设置工具栏窗口初始可见CBRS_BOTTOM窗口初始化时将工具栏放到窗口底部CBRS_FLYBY鼠标箭头在按钮上暂停时,显示工具栏按钮提示CBRS_NOALIGN防止工具栏在其父窗口大小改变时被复位CBRS_TOOLT

IPS鼠标光标在按钮上暂停时,显示工具栏提示CBRS_TOP窗口初始化时将工具栏放在窗口顶部CBRS_SIZE_DYNAM工具栏的大小可变表5-2工具栏停靠位置(2)装载工具栏资源调用LoadToolBar()函数装载工具栏资源。用Create()或者CreateEx()函数创建工具栏,其实

只是获得了一个窗口句柄,工具栏窗口中位图按钮的加载是靠LoadToolBar()函数来完成的。若加载成功,将返回TRUE,否则返回FALSE。该函数原型为:BOOLLoadToolBar(LPCTSTRlpsz

ResourceName);或BOOLLoadToolBar(UINTnIDResource);其中,参数lpszResourceName为字符串形式定义的资源,nIDResource为整型形式定义的资源。(3)设置工具栏停

靠特性设置工具栏停靠特性,需要调用EnableDocking()函数。既要调用CControlBar::EnableDocking()函数设置工具栏的停靠特性,还要调用框架类的成员函数EnableDo

cking()函数来设置框架窗口以允许它的子窗口控制栏可以以何种方式停靠。不管一个框架窗口中有多少个子窗口控制栏,该函数只需调用一次。函数原型如下:voidEnableDocking(DWORDdwStyle);其中,参数dwStyle为工具栏停靠

风格,其值可以使用表5-3所示参数的组合来指定。风格含义CBRS_ALIGN_TOP工具栏可以停靠在客户区顶端CBRS_ALIGN_BOTTOM工具栏可以停靠在客户区底端CBRS_ALIGN_LEFT工具栏可以停靠在客户区左端CBRS_ALIGN_RIGHT工具栏可以停靠在客

户区右端CBRS_ALIGN_ANY工具栏可以停靠在客户区任意位置CBRS_FLOAT_MULTI允许在一个窗口内存在多个可移动工具栏,对CFrame不可用表5-3工具栏停靠位置(4)设置工具栏的初始停靠位置通过调用CFrameW

nd::DockControlBar()函数定位一个工具栏的初始停靠位置。函数的原型为:voidDockControlBar(CControlBar*pBar,UINTnDockBarID=0,LPCRECTl

pRect=NULL);其中参数pBar为需停靠工具栏的指针,nDockBarID指定工具栏在客户区中的停靠位置,其值见表5-4。参数lpRect指定在无客户区时工具栏的停靠位置。位置标志含义0停靠在客户区的任意位置AFX_I

DW_DOCKBAR_TOP停靠在客户区的顶端AFX_IDW_DOCKBAR_BOTTOM停靠在客户区的底端AFX_IDW_DOCKBAR_LEFT停靠在客户区的左端AFX_IDW_DOCKBAR_RIGHT停靠在客户区的右端表5-4工具栏停靠位置3.工具栏实例演示对于示例5-1的菜单添加相应

的工具栏实现,可以通过两种方法实现,一种是直接在应用程序默认生成的工具栏资源IDR_MAINFRAME中添加工具栏按钮,分别实现“画圆”和“输出文本”的功能;另一种方法是创建新的工具栏资源,创建工具栏窗口并

设置适当的停靠风格和停靠位置。(1)在默认生成的工具栏资源中添加按钮实现在工具栏资源编辑器中单击空白的工具按钮,然后利用“图形”工具栏中的工具绘制工具栏按钮上显示的图形,也可以设置图形的线条粗细、颜色等属性。然后双击该工具栏按钮,在弹出的工具栏属性对话框中输入对应的ID,为了实现“画圆”和“

输出文本”的功能,这里分别设置两个工具栏按钮的ID为“ID_DRAW_CIRCLE”和“ID_OUTPUT_TEXT”,如图5-18。图5-18添加“画圆”和“输出文本”工具按钮提示:提示:通常把功能相近的工具栏按钮放在一起,形成一个工具栏按钮组。设置工具栏按钮之间的分割符非常简单,只

需要单击该组第一个按钮并向右拖动就可以实现。(2)创建新的工具栏资源实现首先利用工具栏资源编辑器创建新的工具栏资源,如图5-19所示:图5-19添加新的工具栏资源创建好工具栏资源之后,就可以按照上节所讲的步骤,创建工具栏窗口,载入工具栏资源,设置工具栏的停靠风格和停靠位置。那么在编程的时候有没有

可以提供我们借鉴的程序代码呢?事实上,对于默认的工具栏资源IDR_MAINFRAME,也需要执行这样一个过程,我们可以直接参照它的实现代码来编写我们的工具栏显示程序。在AppWizard创建的MFC程序中,主框架窗口的类名是CMainFrame,该类是

MFC标准类CFrameWnd类的派生类。将项目工作区切换至类视图并展开CMainFrame类,读者会发现该类有一个名为m_wndToolbar的成员。双击该成员,则DeveloperStudio会自动打开类CMainFra

me所在的头文件,并将光标停在对m_wndToolbar成员的定义处,添加新的工具栏变量m_myToolbar。protected://controlbarembeddedmembersCStatusBarm_wndStatusBar;CTo

olBarm_wndToolBar;CToolBarm_myToolBar;◼在CMainFrame类的OnCreate()函数中添加对工具栏实现的代码如下,可以直接复制对默认工具栏窗口实现的代码,然后进行修改:◼intCMainFrame::O

nCreate(LPCREATESTRUCTlpCreateStruct)◼{◼if(CFrameWnd::OnCreate(lpCreateStruct)==-1)◼return-1;◼if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,W

S_CHILD|WS_VISIBLE|CBRS_TOP◼|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||◼!m_wndToolBar.

LoadToolBar(IDR_MAINFRAME))◼{◼TRACE0("Failedtocreatetoolbar\n");◼return-1;//failtocreate◼}◼◼if(!m_wndStatusBar.Create(this)||◼!

m_wndStatusBar.SetIndicators(indicators,◼sizeof(indicators)/sizeof(UINT)))◼{◼TRACE0("Failedtocreatestatusbar\n");◼return-1;//failto

create◼}◼//TODO:Deletethesethreelinesifyoudon'twantthetoolbartobedockable◼m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);◼EnableDockin

g(CBRS_ALIGN_ANY);◼DockControlBar(&m_wndToolBar);◼if(!m_myToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|

WS_VISIBLE|CBRS_TOP◼|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||◼!m_myToolBar.LoadToo

lBar(IDR_TOOLBAR1))//创建工具栏窗口并加载工具栏资源{◼TRACE0("Failedtocreatetoolbar\n");◼return-1;//failtocreate◼}◼m_myToolBar.EnableDocking(CBRS_ALIGN_ANY);/

/设置菜单可以停靠在客户区任意位置◼DockControlBar(&m_myToolBar);//设置工具栏的初始停靠位置◼return0;◼}在程序代码输入无误后,编译、链接并运行程序,得到结果如图5-20所示。图5-20工具栏程序实现运行结果5.5.2显示

和隐藏工具栏◼通过对函数CWnd::SetStyle()的调用可以改变某些工具栏窗口的风格,但该函数不能改变WS_VISIBLE,只能通过父类CWnd的ShowWindow()成员函数来显示或隐藏工具栏。将参数SW_HIDE传给该函数以使工具栏

不可见或传递SW_SHOWNORMAL重新显示工具栏。特别的,对于手工建立的工具条,不具备自动隐藏/显示功能,我们可以通过编程来实现这个工具条的隐藏/显示。◼一旦在程序中改变了工具栏,就必须将这一改变通知框架窗口,通过调用函数CFrameWnd::RecalcLa

yout()来重新调整主框架窗口的布局。◼为了能够隐藏我们手工创建的工具栏,我们添加一个菜单项来完成对工具栏的显示/隐藏。打开菜单资源编辑器,在“测试(&T)”菜单下添加一个新的菜单项“显示/隐藏”,对应的ID为“ID_SHOW_HIDE”。按Ctrl+W键进入Clas

sWizard,在Classname栏中选择CMainFrame,在ObjectIDs栏中选择ID_SHOW_HIDE,并为该命令ID定义命令处理函数OnShowHide()和命令更新处理函数OnUp

dateShowHide(),在两个函数中添加如下代码(粗体显示)实现显示和隐藏的功能。voidCMainFrame::OnShowHide(){//TODO:Addyourcommandhandlercodeherem_my

ToolBar.ShowWindow(m_myToolBar.IsWindowVisible()?SW_HIDE:SW_SHOW);//控制工具栏是否显示,如果已显示则隐藏,否则显示RecalcLayout();//重新

调整主窗口框架布局}voidCMainFrame::OnUpdateShowHide(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCm

dUI->SetCheck(m_myToolBar.IsWindowVisible());//控制菜单上是否出现“√”}运行程序结果如图5-21所示。图5-21工具栏显示和隐藏5.6提高实例――带有工具栏的画图程序

◼1.编程要求◼编写一个单文档应用程序MenuToolTest。在主菜单中增加“线宽”、“颜色”和“图形”3个菜单项,其中“线宽”菜单中包含“粗线”和“细线”两个菜单项;“颜色”菜单中包含“紫色”、“黄色”和“红色”3个菜单项;“图形”包括“扇形”、“弦形”和“五边形”3个菜

单项。为该应用程序创建一个新工具栏和一个上下文菜单,工具栏包含5个按钮,分别与菜单项“粗线”、“细线”、“紫色”、“黄色”和“红色”相对应,快捷菜单上有“扇形”、“弦形”两个菜单项。◼2.编程实现◼(1)利用MFCAppWizard向导生成单文档(SDI)应用程序MenuToolTest,

在项目工作区的ResourceView页面中选择Menu并展开,双击IDR_MAINFRAME项,弹出菜单资源编辑器,按表5-5添加各个菜单项,并设置相应属性。主菜单菜单项ID提示线宽粗线ID_LINE_THICK线宽度为7细线ID_LINE_THIN线宽度为2颜色紫色ID_COLOR_P

URPLE颜色为紫色黄色ID_COLOR_YELLOW颜色为黄色红色ID_COLOR_RED颜色为红色图形扇形ID_SHAPE_SECTOR所画图形为扇形弦形ID_SHAPE_CHORD所画图形为弦形表5-5菜单项属性(2)为应用程序创建一个新的工具栏,如图

5-22,并创建一个新的菜单资源作为上下文菜单加载时使用,如图5-23,注意使工具栏上的各按钮与菜单栏中的菜单项相对应。图5-22工具栏资源图5-23弹出菜单资源(3)为视图类CMenuToolTest添加4个成员变量,代码如下:private:UINT

m_nWidth;//线的宽度,可取1,2,7UINTm_nShape;//图形类型,1为扇形,2为弦形UINTm_nflag;//控制菜单是否加上选中标记COLORREFm_Color;//选择的颜色值在类构造函数中对变量进行初始

化:CMenuToolTestView::CMenuToolTestView(){//TODO:addconstructioncodeherem_nWidth=1;//线宽初始为1m_Color=RGB(0,0

,0);//颜色初始为黑色m_nShape=0;//初始时不显示图形m_nflag=0;//初始时除"扇形"和"弦形"菜单外,其他新增菜单均为不可用}(4)在视图类中映射菜单响应函数,为菜单项“粗线”、“细线”、“紫色”、“黄色”和“红色”分别添加“ON_COMMAN

D”和“ON_UPDATE_COMMAND_UI”消息的映射函数。voidCMenuToolTestView::OnColorPurple(){//TODO:Addyourcommandhandlercodeherem_Color=RGB(255,0,2

55);//设置颜色值Invalidate();//刷新窗口}voidCMenuToolTestView::OnUpdateColorPurple(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI-

>Enable(m_nflag);//单击图形后变为可用if(m_Color==RGB(255,0,255))//使菜单项前有选中标记pCmdUI->SetCheck(true);elsepCmdUI->SetCheck(false);}voidCMenuToolTestVi

ew::OnColorYellow(){//TODO:Addyourcommandhandlercodeherem_Color=RGB(255,255,0);Invalidate();}voidCMenuToolTe

stView::OnUpdateColorYellow(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->Enable

(m_nflag);if(m_Color==RGB(255,255,0))pCmdUI->SetCheck(true);elsepCmdUI->SetCheck(false);}voidCMenuToolTestView::OnColorRed(){//TODO:Addyourcom

mandhandlercodeherem_Color=RGB(255,0,0);Invalidate();}voidCMenuToolTestView::OnUpdateColorRed(CCmdUI*pCmdUI

){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->Enable(m_nflag);if(m_Color==RGB(255,0,0))pCmdUI->

SetCheck(true);elsepCmdUI->SetCheck(false);}voidCMenuToolTestView::OnLineThick(){//TODO:Addyourcommandhandlercodeherem_nWidth=7;//设

置线宽Invalidate();//刷新窗口}voidCMenuToolTestView::OnUpdateLineThick(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->En

able(m_nflag);if(m_nWidth==7)pCmdUI->SetCheck(true);elsepCmdUI->SetCheck(false);}voidCMenuToolTestView::

OnLineThin(){//TODO:Addyourcommandhandlercodeherem_nWidth=2;Invalidate();}voidCMenuToolTestView::OnUpdateLineThin(CCmdUI*pCmdUI){//TODO:Addyo

urcommandupdateUIhandlercodeherepCmdUI->Enable(m_nflag);if(m_nWidth==2)pCmdUI->SetCheck(true);elsepCmdUI->SetCheck(fal

se);}voidCMenuToolTestView::OnShapeSector(){//TODO:Addyourcommandhandlercodeherem_nShape=1;//设置所选图形是扇形m_nflag=1;//改变

此标志变量使颜色和线宽菜单项可用Invalidate();//刷新窗口}voidCMenuToolTestView::OnShapeChord(){//TODO:Addyourcommandhandlercode

herem_nShape=2;m_nflag=1;Invalidate();}(5)在框架类CMainFrame中定义工具栏对象,并在OnCreate()函数中添加工具栏显示代码如下:protected://controlbarembeddedmem

bersCToolBarm_myToolBar;...intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){...if(!m_myToolBar.CreateEx(t

his,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_myToolBar.Loa

dToolBar(IDR_TOOLBAR1))//创建工具栏窗口并加载工具栏资源{TRACE0("Failedtocreatetoolbar\n");return-1;//failtocreate}m_myToolBar.EnableDocking(CBRS_ALIGN_ANY

);//设置菜单可以停靠在客户区任意位置DockControlBar(&m_myToolBar);//设置工具栏的初始停靠位置...}(6)在视图类CMenuToolTestView中添加对WM_RBUTTONUP消息的响应函

数,添加弹出式菜单:voidCMenuToolTestView::OnRButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalld

efaultCMenumenuContext;CMenu*pSubMenu;menuContext.LoadMenu(IDR_MENU1);//载入菜单资源pSubMenu=menuContext.GetSu

bMenu(0);//获得第一个菜单this->ClientToScreen(&point);//客户区坐标转换成屏幕坐标pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);CView::OnRButtonUp(nFlags,

point);}(7)在视图类CMenuToolTestView中修改OnDraw()函数,当刷新窗口时按照所选颜色和线宽创建画笔,绘制图形。voidCMenuToolTestView::OnDraw(CDC*pDC){CMenuToolTestDoc*pDoc=G

etDocument();ASSERT_VALID(pDoc);CPenmypen,*oldpen;mypen.CreatePen(PS_SOLID,m_nWidth,m_Color);//创建实线画笔、线宽及颜色由参数//m_nWidth和m_Color确定oldpen=pDC-

>SelectObject(&mypen);//选择新画笔保留原来画笔if(m_nShape==1)pDC->Pie(30,10,210,190,190,80,50,30);//绘制扇形if(m_nShape==2)pDC->Chord(20,20,140

,140,120,60,20,80);//绘制弦形pDC->SelectObject(oldpen);//恢复原来的画笔mypen.DeleteObject();//删除底层对象//TODO:adddrawcodefornativedata

here}程序运行结果如图本章结束

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?