《MFC典型应用程序设计ppt课件》由会员分享,可在线阅读,更多相关《MFC典型应用程序设计ppt课件(73页珍藏版)》请在金锄头文库上搜索。
1、第第12章章MFC典型应用程序设计典型应用程序设计课程设计题目课程设计题目3.考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计一考勤管理系统,使之能提供以下功能:1)录入学生的缺课记录;2)修改某个学生的缺课记录;3)查询某个学生的缺课情况;4)统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序;5)统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;6)系统以菜单方式工作。12.1消息处理机制消息处理机制 WindowsWindows程序与其他程序最大的不同之处在于使用消息机制。程序与其他程序
2、最大的不同之处在于使用消息机制。 WindowsWindows程程序序中中所所发发生生的的一一切切都都可可以以用用消消息息表表示示,消消息息用用于于告告诉诉操操作作系系统统所发生的事情,如按键操作或鼠标操作等。所发生的事情,如按键操作或鼠标操作等。 MFCMFC应应用用程程序序也也使使用用基基于于消消息息的的事事件件驱驱动动机机制制,而而且且MFCMFC提提供供的的消消息息处处理理机制使得用户可以更加方便、简易的处理消息。机制使得用户可以更加方便、简易的处理消息。在在WindowsWindows中中,所所有有消消息息都都是是通通过过消消息息名名进进行行访访问问的的,但但不不同同类类型型的的消消
3、息息由应用程序的不同部分进行处理。由应用程序的不同部分进行处理。 1. MFC1. MFC消息种类消息种类 消息机制是消息机制是Windows应用程序的核心,应用程序的核心,MFC中的消息可以分为:中的消息可以分为:Windows消息消息控件通知消息控件通知消息定时消息定时消息命令消息命令消息12.1消息处理机制消息处理机制Windows消息消息 WindowsWindows消息通常指以消息通常指以WMWM开头的消息,但开头的消息,但WM_COMMANDWM_COMMAND除外。除外。键盘消息和鼠标消息都属于键盘消息和鼠标消息都属于WindowsWindows消息,消息,WindowsWind
4、ows消息由窗口和视图进行消息由窗口和视图进行处理。处理。 WindowsWindows消息通常带有若干个参数传递给消息处理函数,这些参数为处理消息通常带有若干个参数传递给消息处理函数,这些参数为处理函数正确地处理消息提供了充分的信息。函数正确地处理消息提供了充分的信息。控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的消息。消息。 MFCMFC对控件通知消息的传递方式与其他以对控件通知消息的传递方式与其他以WMWM开头的开头的WindowsWindows消息一样,消息一样,但但BN_CLICKEDBN_CLICKED例外,
5、该消息的传递方式与命令消息的传递机制相同。例外,该消息的传递方式与命令消息的传递机制相同。对于对于WindowsWindows消息和控件通知消息,消息和控件通知消息,MFCMFC将消息传递给相应的窗口处理。将消息传递给相应的窗口处理。 控件通知消息控件通知消息定时消息定时消息定时消息也是Windows的一类重要消息。当需要应用程序每隔一个指定的时间间隔便执行某一特定操作时,就需要使用定时消息WM_TIMER。在进行定时操作时,用户需要调用SetTimer函数创建一个定时器,并设置定时器的事件标志nIDEvent及时间间隔nElapse,然后编写消息WM_TIMER的消息处理函数OnTimer(
6、),实现定时操作。命令消息命令消息是来自于用户界面对象的WM_COMMAND消息。包括菜单、工具栏按钮和加速键都属于命令消息等。即每当用户选择一个菜单项、单击一个按钮或需要告诉操作系统应当执行什么操作时,则发送一条WM_COMMAND命令消息。WM_COMMAND消息的消息映射宏为OnCommand()。所有命令消息都包含有一个相同类型的参数,即该命令消息需要操作的资源ID值,由ID值映射消息处理函数。2MFC消息映射机制消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,它消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,它能找到处理该消息的函数。能找到处理该消息的函数。V
7、isualC+的消息映射宏消息映射宏消息映射宏功功能能DECLARE_MESSAGE_MAP在头文件中使用,用于声明在源文件中存在消息映射在头文件中使用,用于声明在源文件中存在消息映射BEGIN_MESSAGE_MAP表示消息映射的开始,用于源代码文件中表示消息映射的开始,用于源代码文件中END_MESSAGE_MAP表示消息映射的结束,用于源代码文件中表示消息映射的结束,用于源代码文件中ON_COMMAND将将特特定定的的命命令令消消息息映映射射到到类类的的成成员员函函数数,即即使使用用该该成成员函数处理消息员函数处理消息ON_COMMAND_RANGE将一组特定的命令消息映射到类的成员函数
8、将一组特定的命令消息映射到类的成员函数VisualC+的消息映射分为两个方面:的消息映射分为两个方面:一是在头文件一是在头文件.h中处理中处理一是在实现文件一是在实现文件.cpp中处理中处理消息映射宏消息映射宏在头文件MyWinp.h中的消息映射代码/AFX_MSG(CMyWinPApp)afx_msg void OnAppAbout();/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see in these blocks of generated code !/AFX
9、_MSGDECLARE_MESSAGE_MAP()在实现文件中的消息映射代码BEGIN_MESSAGE_MAP(CMyWinPApp,CWinApp)/AFX_MSG_MAP(CMyWinPApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/NOTE-the ClassWizard will add and remove mapping macros here./DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/Standard document commandsON_CO
10、MMAND(ID_)ON_COMMAND(ID_)/Standard print setup commandON_COMMAND(ID_: On)END_MESSAGE_MAP()消息映射宏的使用宏宏DECLARE_MESSAGE_MAP用于类声明文件的结束处,即在用于类声明文件的结束处,即在.h文件的文件的结束处。结束处。宏宏BEGIN_MESSAGE_MAP和和END_MESSAGE_MAP用于类的实现文件用于类的实现文件(.cpp)中实现消息映射,而且这两个宏必须配合使用。)中实现消息映射,而且这两个宏必须配合使用。在在BEGIN_MESSAGE_MAP与与END_MESSAGE_MAP
11、中中间间列列出出了了消消息息映射的各个入口。例如,以下消息映射语句:映射的各个入口。例如,以下消息映射语句:ON_COMMAND(ID_, CWinApp:On)表表示示当当用用户户单单击击了了菜菜单单项项时时,则则发发送送WM_COMMAND消消息息,该该消消息息找找到到此此语语句句,发发现现资资源源ID值值与与资资源源ID_匹匹配配,则则执执行行该该语语句句中中指指定定的的成成员员函函数数CWinApp:On()。消息映射宏的使用消息映射宏的使用(续续)向导向导AppWizard生成的单文档应用程序一般包括四个基本类:生成的单文档应用程序一般包括四个基本类:应用程序类应用程序类主框架窗口类
12、主框架窗口类文档类文档类视图类视图类其他相关文件。其他相关文件。12.2应用程序分析1.AppWizard向导生成的类和文件向导生成的类和文件单击项目工作区的单击项目工作区的ClassViewClassView标签,则显示标签,则显示CMainFrameCMainFrame(主框架窗口类主框架窗口类)、)、CMyWinPAppCMyWinPApp(应用程序类应用程序类)、)、CMyWinPDocCMyWinPDoc( 文档类文档类)和)和CMyWipViewCMyWipView( 视图类视图类)等,这是应用程序)等,这是应用程序MyWinPMyWinP的全部类。的全部类。1.AppWizard
13、向导生成的类和文件向导生成的类和文件利用利用AppWizardAppWizard向导创建应用程序框架时,产生的各派生类将被创建单独的源向导创建应用程序框架时,产生的各派生类将被创建单独的源文件。文件。单击某一类名(如单击某一类名(如CMyWinPViewCMyWinPView)前的)前的“+”+”号,则列出该类的成员函数,双号,则列出该类的成员函数,双击类名或成员函数名击类名或成员函数名( (如如GetDocument)GetDocument),则源代码编辑区显示出该类或该成员函,则源代码编辑区显示出该类或该成员函数的实现代码。数的实现代码。 观察应用程序观察应用程序MyWinP的类和文件的类
14、和文件 MyWinPMyWinP程序的应用程序类名为程序的应用程序类名为CMyWinPApp CMyWinPApp ,由,由CwinAppCwinApp类派生而类派生而来。来。 该类的每一个对象代表一个应用程序,程序中默认定义一个全局该类的每一个对象代表一个应用程序,程序中默认定义一个全局对象对象theApptheApp。(1)应用程序类应用程序类CMyWinPAppCMyWinPApp类的功能是类的功能是管理整个应用程序管理整个应用程序,负责程序的启动、初始化、,负责程序的启动、初始化、窗口的创建以及从窗口的创建以及从WindowsWindows中获取消息并将消息分发到适当的目的地。中获取消
15、息并将消息分发到适当的目的地。CMyWinPAppCMyWinPApp类的声明在头文件类的声明在头文件MyWinPApp.hMyWinPApp.h中,类的实现在中,类的实现在CMyWinPApp.cppCMyWinPApp.cpp中。中。(1)应用程序类应用程序类 CMyWinP应应用用程程序序的的主主框框架架窗窗口口类类名名为为CMainFrame,它它由由CWnd的一个子类派生而来,该子类即的一个子类派生而来,该子类即CFrameWnd。CMainFrame类类的的声声明明在在头头文文件件MainFrame.h中中,类类的的实实现现在在文文件件MainFrame.cpp中。中。(2)主框架
16、架窗口类主框架架窗口类CMainFrame类类管管理理主主框框架架窗窗口口,并并拥拥有有一一些些如如菜菜单单、工工具具栏栏和和状状态栏等控件,同时,它还扮演转发菜单和工具栏消息的角色。态栏等控件,同时,它还扮演转发菜单和工具栏消息的角色。(2)主框架架窗口类主框架架窗口类 CMyWinPCMyWinP应应用用程程序序的的文文档档类类名名为为CMyWinPDocCMyWinPDoc,从从MFCMFC的的CDocumentCDocument类类派派生生而而来来。其其类类的的声声明明在在头头文文件件CMyWinPDoc.hCMyWinPDoc.h中中,类类的的实实现现在在文文件件CMyWinPDoc
17、.cppCMyWinPDoc.cpp中。中。(3)文档类文档类 文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。用用户户需需要要修修改改文文档档类类,增增加加成成员员变变量量以以存存储储应应用用程程序序的的数数据据、增增加成员函数以获得和修改数据,然后为应用程序服务。加成员函数以获得和修改数据,然后为应用程序服务。 (3)文档类文档类 CMyWinPCMyWinP应用程序的视图类名为应用程序的视图类名为CMyWinPViewCMyWinPView,类的声明在头文件,类的声明在头文件MyWinPView.hMyWinPView.
18、h中,而类的实现在文件中,而类的实现在文件MyWinPView.cppMyWinPView.cpp中。中。(4)视图类视图类视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。(4)视图类视图类(5)其他文件其他文件除除以以上上主主要要类类之之外外,AppWizard还还自自动动生生成成Stdafx.cpp和和stdafx.h两两个个文件。文件。这这两两个个文文件件是是每每个个基基于于MFC程程序序所所必必需需的的,用用于于建建立立一一个个预预编编译译头头文文件件*.pch和一个预定义的类型文件和一个预定义的类型文件stdaf
19、x.obj。MFC包包含含很很多多头头文文件件,如如果果每每次次都都编编译译则则比比较较费费时时,将将afxwin.h、afxext.h、afxcmn.h、afxdisp.h都都放放在在stdafx.h文文件件中中,这这样样编编译译系系统统可可以以识别哪些文件已经编译过,以加速应用程序的编译过程。识别哪些文件已经编译过,以加速应用程序的编译过程。12.3输入输入/输出处理程序输出处理程序输入输出处理是几乎所有输入输出处理是几乎所有Windows应用程序最基本的功能之一应用程序最基本的功能之一Windows应应用用程程序序通通过过对对键键盘盘消消息息和和鼠鼠标标消消息息的的响响应应完完成成对对用
20、用户户输输入的处理入的处理通过通过GDI提供的绘图函数在窗口的客户区输出信息。提供的绘图函数在窗口的客户区输出信息。1.文本输出程序 文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。 在在MFCMFC中,中,CDCCDC类实现了对设备环境的封装,类实现了对设备环境的封装,CDCCDC类有许多成员函数,完类有许多成员函数,完成各种与设备环境有关的操作。成各种与设备环境有关的操作。 DrawText函数函数DrawText函数是函数是CDC类用于文本输出的成员函数之一,它的作用是在指类用于文本输出的成员函数之一,它的作用是在指定矩
21、形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。定矩形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。DrawText函数的格式如下:函数的格式如下:形式一:形式一:virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);形式二:形式二:intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);参数含义参数含义参数参数1pszString1pszString是指向输出字符串的指针;是指向输出字符串的指针;参数参数nCountnCount
22、指定字符串的长度,如果为指定字符串的长度,如果为-1-1,则,则1pszString1pszString是一个指向以是一个指向以nullnull结尾的字符串的长指针;结尾的字符串的长指针;参数参数lpRectlpRect是指向是指向RECTRECT结构的指针;结构的指针;参数参数nFormatnFormat用于指定输出格式;用于指定输出格式; strstr表示存储字符串的表示存储字符串的CStringCString对象。对象。 TextOut函数TextOutTextOut函数也是函数也是CDCCDC类用于文本输出的成员函数,它的作用是在指定的起点坐类用于文本输出的成员函数,它的作用是在指定的
23、起点坐标上,以当前字体、颜色等属性显示字符串。标上,以当前字体、颜色等属性显示字符串。 TextOutTextOut函数格式函数格式 :形式一:形式一:virtualintTextOut(intx,inty,LPCTSTRlpszString,intnCount);形式二:形式二:BOOLTextOut(intx,inty,constCString&str);参数含义参数含义参数参数x,yx,y表示欲显示字符串起点坐标;表示欲显示字符串起点坐标;参数参数lpszStringlpszString指向要显示字符串的指针;指向要显示字符串的指针;参数参数nCountnCount指定字符串的长度;指定
24、字符串的长度; strstr存储字符串的存储字符串的CStringCString对象。对象。 OnDraw函数void OnDraw(CDC *pDC) OnDrawOnDraw函数是视图类的一个重要成员函数。函数是视图类的一个重要成员函数。成员函数成员函数OnDrawOnDraw管理文档类成员变量的显示,即管理文档类成员变量的显示,即OnDrawOnDraw函数主要用于更新函数主要用于更新视图窗口。视图窗口。 GetDocument函数函数GetDocument函数返回一个指向关联文档对象的指针。函数返回一个指向关联文档对象的指针。通过通过GetDocument函数返回的文档对象指针,视图对
25、象可以调用文档类及函数返回的文档对象指针,视图对象可以调用文档类及其派生类的成员函数或直接读取文档对象的公有数据成员,获取应用程序其派生类的成员函数或直接读取文档对象的公有数据成员,获取应用程序的数据。的数据。GetDocument函数的格式如下:函数的格式如下:CDocument *GetDocument() const 2键盘输入处理程序键盘输入处理程序Windows环境下接受到按键消息的窗口称为环境下接受到按键消息的窗口称为“有输入焦点有输入焦点”的窗口。的窗口。键盘消息键盘消息在在Windows应用程序运行时若用户按下一个键,就会产生一个键盘消息,如:应用程序运行时若用户按下一个键,就
26、会产生一个键盘消息,如:WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUP其中其中WM_SYSKEYDOWN、WM_SYSKEYUP中的中的SYS表示系统按键消息,表示系统按键消息,由由Windows处理,应用程序只需处理处理,应用程序只需处理WM_KEYDOWN和和WM_KEYUP等非系统按等非系统按键消息。键消息。afx_msgvoidOnChar(UNITnChar,UINTnRepCnt,UINTnFlags)WM_CHAR的消息处理函数:的消息处理函数:nChar表示按键的字符代码值;表示按键的字符代码值;nRepCnt表示按键的重复次数,因此若用户
27、按下某键不放,该参数值将不断表示按键的重复次数,因此若用户按下某键不放,该参数值将不断增加;增加;nFlags用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等相关信息。相关信息。虚拟键代码虚拟键代码键盘上每一个有意义的键都对应着一个惟一的标识值,即键盘扫描码,当键盘上每一个有意义的键都对应着一个惟一的标识值,即键盘扫描码,当用户按下或释放一个按键时,都会产生扫描码。用户按下或释放一个按键时,都会产生扫描码。扫描码是依赖于具体设备的。扫描码是依赖于具体设备的。Windows应用程序中一般使用与具体设备无应用程序中一般使用与具
28、体设备无关的虚拟码。关的虚拟码。虚拟码是虚拟码是Windows系统内部定义的与设备无关的键盘标识,从而有效避免系统内部定义的与设备无关的键盘标识,从而有效避免了键盘对应用程序的影响,提高了应用程序的通用性。了键盘对应用程序的影响,提高了应用程序的通用性。部分常用的虚拟键代码虚拟键代码虚拟键代码对应功能键对应功能键虚拟键代码虚拟键代码对应功能键对应功能键VK_INSERTInsertVK_DOWN(箭头向下箭头向下)VK_LEFT(左箭头左箭头)VK_NEXTPageDown键键VK_RIGHT(右箭头右箭头)VK_BACKBackSpace键键VK_UP(箭头向上箭头向上)VK_RETURNE
29、nter键键VK_AZ字母字母AZVK_TABTab键键!显示键盘输入字符程序的实现方法!显示键盘输入字符程序的实现方法利用利用AppWizard向导生成项目名为向导生成项目名为MyWinKey的应用程序框架。的应用程序框架。向向文文档档类类中中添添加加保保存存字字符符的的数数据据成成员员m_MyText(既既可可以以利利用用向向导导添添加加,也也可以手工添加可以手工添加)。通通过过ClassWizard向向导导向向视视图图类类中中添添加加消消息息处处理理函函数数Onchar,并并建建立立消消息息映射。映射。编译并运行应用程序即可实现将键盘输入的字符在窗口客户区显示。编译并运行应用程序即可实现
30、将键盘输入的字符在窗口客户区显示。CClientDCDc(this);/获得窗口客户区设备环境CCMyWinKeyDoc*pDoc=GetDocument();pDoc-m_MyText+=nChar;Dc.SetTextColor(RGB(0,0,255);Dc.TextOut(0,0,pDoc-m_MyText);3.鼠标处理程序Windows应用程序的鼠标消息,可以被任何窗口接受应用程序的鼠标消息,可以被任何窗口接受只要鼠标移动到该窗口并有鼠标按键消息,该窗口就可以接受到鼠标只要鼠标移动到该窗口并有鼠标按键消息,该窗口就可以接受到鼠标消息,消息,与该窗口是否活动窗口或是否带有输入焦点没有
31、关系。与该窗口是否活动窗口或是否带有输入焦点没有关系。鼠标消息鼠鼠标标在在窗窗口口客客户户区区移移动动时时产产生生WM_MOUSEMOVE消消息息.鼠鼠标标在在客客户户区区产产生生的的消消息息由由Windows应应用用程程序序处处理理,而而在在窗窗口口边边界界、菜菜单单、标标题题栏栏和和滚滚动动条条等等非非客客户区产生的鼠标消息一般由户区产生的鼠标消息一般由Windows系统处理。系统处理。鼠标消息属于鼠标消息属于Windows消息消息鼠标消息均可直接利用鼠标消息均可直接利用VisualC+6.0的的ClassWizard向导添加鼠标消息处理函向导添加鼠标消息处理函数数与鼠标消息对应的消息处理
32、函数如表与鼠标消息对应的消息处理函数如表12-3所示。所示。消息处理函数消息处理函数常用鼠标消息处理函数表鼠标消息消息处理函数备注WM_MOUSEMOVEvoidOnMouseMove(UINTnFlags,CPointpoint)鼠标移动WM_LBUTTONDOWNvoidOnLButtonDown(UINTnFlags,CPointpoint)单 击 鼠 标左键WM_MBUTTONDOWNvoidOnMButtonDown(UINTnFlags,CPointpoint)单 击 鼠 标中键WM_RBUTTONDOWNvoidOnRButtonDown(UINTnFlags,CPointpoi
33、nt)单 击 鼠 标右键WM_LBUTTONUPvoid OnLButtonUp(UINT nFlags,CPointpoint)鼠 标 左 键释放鼠标消息处理函数表(续)WM_MBUTTONUPvoidOnMButtonUp(UINTnFlags,CPointpoint)鼠鼠标标中中键键释放释放WM_RBUTTONUPvoidOnRButtonUp(UINTnFlags,CPointpoint)鼠鼠标标右右键键释放释放WM_LBUTTONDBLICKvoid OnLButtonDblClk(UINTnFlags,CPointpoint)双双击击鼠鼠标标左键左键WM_MBUTTONDBLICK
34、void OnMButtonDblClk(UINTnFlags,CPointpoint)双双击击鼠鼠标标中键中键WM_RBUTTONDBLICKvoid OnRButtonDblClk(UINTnFlags,CPointpoint)双双击击鼠鼠标标右键右键菜单和工具栏菜单和工具栏在在VC+VC+程序设计中,菜单和工具栏的设计过程相同,需要通过以下程序设计中,菜单和工具栏的设计过程相同,需要通过以下3 3个步个步骤实现:骤实现:(1 1)通过资源编辑器修改或建立菜单与工具栏。)通过资源编辑器修改或建立菜单与工具栏。(2 2)通过)通过MFCMFC向导建立各菜单项或工具命令按钮的消息响应函数。向导
35、建立各菜单项或工具命令按钮的消息响应函数。(3 3)通过应用程序框架提供的菜单或工具栏加载命令,将菜单或工具栏加)通过应用程序框架提供的菜单或工具栏加载命令,将菜单或工具栏加载到应用程序框架中。载到应用程序框架中。1 1 直接修改应用程序框架的菜单直接修改应用程序框架的菜单设计菜单,并通过菜单完成画线、画椭圆、画矩形设计菜单,并通过菜单完成画线、画椭圆、画矩形菜单设计过程如下菜单设计过程如下1用菜单编辑器添加菜单栏及菜单项用菜单编辑器添加菜单栏及菜单项(1)打开项目文件)打开项目文件My.Dsw,选择工程管理窗口中的,选择工程管理窗口中的ResourceView标标签,展开签,展开Myreso
36、urces中的中的Menu菜单资源列表项,在其中可以见菜单资源列表项,在其中可以见到到IDR_MAINFRAME,它就是应用程序菜单的标识,双击该标识将,它就是应用程序菜单的标识,双击该标识将在右边编辑窗口中见到它所代表的菜单内容。在右边编辑窗口中见到它所代表的菜单内容。图12-271用菜单编辑器添加菜单栏及菜单项用菜单编辑器添加菜单栏及菜单项(2)右键单击图中)右键单击图中“帮助帮助”菜单后面的虚线框,将弹出属性对话框。菜单后面的虚线框,将弹出属性对话框。在在“C标题标题”编辑框中输入编辑框中输入“绘图绘图”。由于。由于“绘图绘图”是主菜单,选择是主菜单,选择它时并不需要执行任何程序功能,所
37、以其属性对话框中的它时并不需要执行任何程序功能,所以其属性对话框中的“ID”是是禁用的。禁用的。1直接修改应用程序框架的菜单图12-28(3)完成上面的步骤后,在)完成上面的步骤后,在“绘图绘图”菜单栏的下面将会出现虚线框,右键菜单栏的下面将会出现虚线框,右键单击它并将其单击它并将其“标题标题”设置为设置为“直线直线”,将其,将其“ID”设置为设置为“ID_LINE”。(4)用同样的方法在)用同样的方法在“直线直线”下面添加下面添加“矩形矩形”,“椭圆椭圆”菜单项,并将菜单项,并将矩形的矩形的ID设置为设置为“ID_RECT”,将椭圆的,将椭圆的ID设置为设置为“ID_ELLIPSE”。(5)
38、修改或删除菜单栏中不需要的菜单,如删除其中的)修改或删除菜单栏中不需要的菜单,如删除其中的“帮助帮助”菜单,方菜单,方法是选中该菜单,然后按法是选中该菜单,然后按Delete键或选择键或选择VC+“编辑编辑”菜单中的菜单中的“删除删除”命令。命令。1直接修改应用程序框架的菜单直接修改应用程序框架的菜单上面的操作过程将建立如图所示的菜单。上面的操作过程将建立如图所示的菜单。1直接修改应用程序框架的菜单直接修改应用程序框架的菜单2利用向导生成菜单消息响应函数利用向导生成菜单消息响应函数(1)按快捷键)按快捷键Ctrl+W键启动键启动MFC的类向导,如图所示。的类向导,如图所示。(2)选择类向导中的
39、)选择类向导中的“MessageMaps”标签,在标签,在“Classname”下拉列表下拉列表中选择中选择“CMyView”类,在类,在“ObjectIDs”列表中具有所有的菜单标识,列表中具有所有的菜单标识,找到并选中找到并选中“ID_LINE”菜单标识,并选中菜单标识,并选中“Messages:”列表中的列表中的“COMMAND”,然后单击命令按钮,然后单击命令按钮“AddFunction”。该操作会为。该操作会为CMyView类添加消息响应函数类添加消息响应函数OnLine。(3)用同样的方法为)用同样的方法为CMyView类增加类增加ID_RECT、ID_ELLIPSE和和ID_ST
40、UDENT菜单标识的消息响应函数:菜单标识的消息响应函数:OnRect、OnEllipse、OnStudent。经过上述操作,经过上述操作,MFC向导会在向导会在CMyView类中完成下面的类中完成下面的3件事。件事。向导将在向导将在CMyView类中添加消息响应函数的声明,如下所示:类中添加消息响应函数的声明,如下所示:classCMyView:publicCViewprotected:afx_msgvoidOnLine();afx_msgvoidOnEllipse();afx_msgvoidOnRect();afx_msgvoidOnStudent();向导添加的菜单消向导添加的菜单消息处
41、理函数息处理函数向导将在程序实现文件向导将在程序实现文件CMyView.cpp的消息映射宏中,添加菜单项与消的消息映射宏中,添加菜单项与消息处理函数之间的映射,如下所示:息处理函数之间的映射,如下所示:BEGIN_MESSAGE_MAP(CMyView,CView)/AFX_MSG_MAP(CMyView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_ELLIPSE,OnEllipse)ON_COMMAND(ID_RECT,OnRect)ON_COMMAND(ID_STUDENT,OnStudent)/AFX_MSG_MAPEND_MESSAGE_MAP()红
42、字是向导添加的红字是向导添加的菜单消息映射宏菜单消息映射宏2 2利用向导生成菜单消息响应函数利用向导生成菜单消息响应函数 向导将在类的程序文件向导将在类的程序文件CMyView.cppCMyView.cpp中添加消息处理函数的雏形,如下中添加消息处理函数的雏形,如下所示。所示。voidCMyView:OnLine()/TODO:Addyourcommandhandlercodehere向导添加的菜单消向导添加的菜单消息处理函数雏形息处理函数雏形在向导生成的消息处理函数中添加函数功能代码在向导生成的消息处理函数中添加函数功能代码voidCMyView:OnLine()/选择选择“绘图绘图|直线直
43、线”菜单执行该函数菜单执行该函数CClientDCdc(this);/获取设备环境获取设备环境dc.MoveTo(50,100);/将光标移到将光标移到(50,100)位置位置dc.LineTo(100,300);/从光标位置即从光标位置即(50,100)画直线到画直线到(100,300)voidCMyView:OnEllipse()/选择选择“绘图绘图|椭圆椭圆”菜单执行该函数菜单执行该函数CClientDCdc(this);dc.Ellipse(100,100,200,300);voidCMyView:OnRect()/选择选择“绘图绘图|矩形矩形”菜单执行该函数菜单执行该函数CClien
44、tDCdc(this);dc.Rectangle(300,100,500,200);2 2 建立建立新菜单栏【例例】 为上一例重新建立一新菜单,实现同样的功能。为上一例重新建立一新菜单,实现同样的功能。实现过程简述如下实现过程简述如下 (1 1)在)在VC+VC+中打开例上例建立的项目文件中打开例上例建立的项目文件My.dswMy.dsw,在工程管理窗口,在工程管理窗口“ResourceView”ResourceView”中展开中展开“My resources”My resources”资源,右键单击资源,右键单击“Menu”,并从弹出的快捷菜单中选择并从弹出的快捷菜单中选择“InsertMe
45、nu”,VC+VC+将插入一个标识将插入一个标识为为“IDR_MENU1”的菜单。用前面的方法添加的菜单。用前面的方法添加“画图画图”和和“学生学生”菜菜单,如图所示。单,如图所示。图12-32新菜单新菜单IDR_MENU1设置其中菜单项设置其中菜单项“直线直线”的的ID为为“IDR_LINE1”,“矩形矩形”的的ID为为“IDR_RECT1”、“椭圆椭圆”的的ID为为“IDR_ELLIPSE1”,“输入学生档案输入学生档案”的的ID为为“ID_STUDENT1”。(2 2)按快捷键)按快捷键Ctrl+WCtrl+W,弹出如图,弹出如图12-3312-33(a a)所示的对话框,选择)所示的对
46、话框,选择“Select Select an existing class”an existing class”,然后单击,然后单击“OK”OK”按钮,弹出如图按钮,弹出如图12-3312-33(b b)所示)所示对话框,选择对话框,选择“CMyView”CMyView”,然后单击,然后单击“Select”Select”按钮。按钮。3)通过消息映射向导“MessageMaps”建立菜单项IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函数和函数代码,方法和代码同前例。4)加载新菜单。打开CMyApp:InitInstanceCMyApp:Ini
47、tInstance函数,将其中建立单文档模板时指定的菜单标识IDR_MAINFRAMEIDR_MAINFRAME修改为新菜单的标识IDR_MENU1IDR_MENU1,如下所示。BOOLCMyApp:InitInstance()CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MENU1,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CMyView);以前这里是IDR_MAINFRAME3工具栏操作工具栏的建立方法与菜单完全相
48、同,但须注意两点工具栏的建立方法与菜单完全相同,但须注意两点(1 1)工具栏的修改或新建需要通过)工具栏的修改或新建需要通过C+C+工程项目窗口工程项目窗口“ResourceView”ResourceView”中的中的“Toolbar”Toolbar”选项进行。选项进行。(2 2)加载新建工具栏的方法是通过)加载新建工具栏的方法是通过CMainFrame:OnCreateCMainFrame:OnCreate成员函数实现的,成员函数实现的,如下所示。将其中如下所示。将其中LoadToolBarLoadToolBar函数的参数函数的参数IDR_MAINFRAMEIDR_MAINFRAME修改为新
49、工具修改为新工具栏的标识就行了。栏的标识就行了。3工具栏操作工具栏的建立方法与菜单完全相同,但须注意两点工具栏的建立方法与菜单完全相同,但须注意两点intCMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct)if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)/加载工
50、具栏加载工具栏3工具栏操作【例例】 修改前例,为它建立一个新工具栏,工具栏实现与菜单同样的功能。修改前例,为它建立一个新工具栏,工具栏实现与菜单同样的功能。建立过程如下:建立过程如下:(1 1)用与新建菜单相同的的方法插入一个工具栏)用与新建菜单相同的的方法插入一个工具栏ToolbarToolbar,它的默认标识为,它的默认标识为IDR_TOOLBAR1IDR_TOOLBAR1。(2 2)通过)通过VC+VC+的工具编辑器在的工具编辑器在IDR_TOOLBAR1IDR_TOOLBAR1上绘制并添加上绘制并添加4 4个图形按钮,如个图形按钮,如图所示。图所示。3 工具栏操作(3 3)修改命令按钮
51、的)修改命令按钮的IDID,方法是双击对应的按钮图标,在弹出的属性对话,方法是双击对应的按钮图标,在弹出的属性对话框中修改框中修改IDID。将直线按钮的。将直线按钮的IDID改为改为“ID_TLineID_TLine”,矩形按钮的,矩形按钮的IDID改为改为“ID_TRectID_TRect”,椭圆按钮的,椭圆按钮的IDID改为改为“ID_TElliseID_TEllise”,学生按钮的,学生按钮的IDID改为改为“ID_TStudentID_TStudent”。(4 4)通过向导指定)通过向导指定IDR_TOOLBAR1IDR_TOOLBAR1所属类为所属类为CMyViewCMyView。图
52、12-333工具栏操作(5 5)通过类向导的)通过类向导的“Message MapsMessage Maps”建立各命令按钮在建立各命令按钮在CMyViewCMyView类中的消息类中的消息响应函数,方法与菜单消息响应函数的建立过程相同。然后在各消息响应响应函数,方法与菜单消息响应函数的建立过程相同。然后在各消息响应函数中添加程序代码,如下所示:函数中添加程序代码,如下所示:voidCMyView:OnTEllise()OnEllipse();/椭圆按钮椭圆按钮voidCMyView:OnTLine()OnLine();/直线按钮直线按钮voidCMyView:OnTRect()OnRect();/矩形按钮矩形按钮