MFC典型应用程序设计1 (2)ppt课件_第1页
MFC典型应用程序设计1 (2)ppt课件_第2页
MFC典型应用程序设计1 (2)ppt课件_第3页
MFC典型应用程序设计1 (2)ppt课件_第4页
MFC典型应用程序设计1 (2)ppt课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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除外。除外。键盘消息和鼠标消息都属于键盘消息和鼠标消息都属于WindowsWi

4、ndows消息,消息,WindowsWindows消息由窗口和视图进消息由窗口和视图进行处理。行处理。 WindowsWindows消息通常带有若干个参数传递给消息处理函数,这些参数为处理消息通常带有若干个参数传递给消息处理函数,这些参数为处理函数正确地处理消息提供了充分的信息。函数正确地处理消息提供了充分的信息。 控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的消息。消息。 MFCMFC对控件通知消息的传递方式与其他以对控件通知消息的传递方式与其他以WMWM开头的开头的WindowsWindows消息一样,消息一样,但但

5、BN_CLICKEDBN_CLICKED例外,该消息的传递方式与命令消息的传递机制相同。例外,该消息的传递方式与命令消息的传递机制相同。对于对于WindowsWindows消息和控件通知消息,消息和控件通知消息,MFCMFC将消息传递给相应的窗口处理。将消息传递给相应的窗口处理。 控件通知消息控件通知消息 定时消息定时消息 定时消息也是Windows的一类重要消息。当需要应用程序每隔一个指定的时间间隔便执行某一特定操作时,就需要使用定时消息WM_TIMER。在进行定时操作时,用户需要调用SetTimer函数创建一个定时器,并设置定时器的事件标志nIDEvent及时间间隔nElapse,然后编写

6、消息WM_TIMER的消息处理函数OnTimer(),实现定时操作。 命令消息 命令消息是来自于用户界面对象的WM_COMMAND消息。包括菜单、工具栏按钮和加速键都属于命令消息等。即每当用户选择一个菜单项、单击一个按钮或需要告诉操作系统应当执行什么操作时,则发送一条WM_COMMAND命令消息。WM_COMMAND消息的消息映射宏为OnCommand()。所有命令消息都包含有一个相同类型的参数,即该命令消息需要操作的资源ID值,由ID值映射消息处理函数。2 MFC消息映射机制 消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,消息映射是指将消息与处理函数相联系,即当系统产生一条消息

7、时,它能找到处理该消息的函数。它能找到处理该消息的函数。Visual C+的消息映射宏 消息映射宏消息映射宏 功功 能能DECLARE_MESSAGE_MAP在头文件中使用,用于声明在源文件中存在消息映射在头文件中使用,用于声明在源文件中存在消息映射BEGIN_MESSAGE_MAP表示消息映射的开始,用于源代码文件中表示消息映射的开始,用于源代码文件中END_MESSAGE_MAP表示消息映射的结束,用于源代码文件中表示消息映射的结束,用于源代码文件中ON_COMMAND将特定的命令消息映射到类的成员函数,即使用该成将特定的命令消息映射到类的成员函数,即使用该成员函数处理消息员函数处理消息O

8、N_COMMAND_RANGE将一组特定的命令消息映射到类的成员函数将一组特定的命令消息映射到类的成员函数Visual C+的消息映射分为两个方面:的消息映射分为两个方面: 一是在头文件一是在头文件.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

9、in these blocks of generated code !/AFX_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

10、_MSG_MAP/Standard document commandsON_COMMAND(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)中实现消息映射,而且这两个宏必须配合使用。)中实现消息映射,而且这两个宏必须配

11、合使用。 在在BEGIN_MESSAGE_MAP与与END_MESSAGE_MAP中间列出了消息中间列出了消息映射的各个入口。例如,以下消息映射语句:映射的各个入口。例如,以下消息映射语句:ON_COMMAND(ID_, CWinApp:On)表示当用户单击了菜单项时,则发送表示当用户单击了菜单项时,则发送WM_COMMAND消息,该消息找消息,该消息找到此语句,发现资源到此语句,发现资源ID值与资源值与资源ID_匹配,则执行该语句中指定的成员函数匹配,则执行该语句中指定的成员函数CWinApp:On ()。 消息映射宏的使用消息映射宏的使用(续续) 向导向导AppWizard生成的单文档应用

12、程序一般包括四个基本类:生成的单文档应用程序一般包括四个基本类:应用程序类应用程序类主框架窗口类主框架窗口类文档类文档类视图类视图类其他相关文件。其他相关文件。12.2应用程序分析 1.AppWizard向导生成的类和文件向导生成的类和文件 单击项目工作区的单击项目工作区的ClassViewClassView标签,则显示标签,则显示CMainFrameCMainFrame(主框架窗口类主框架窗口类)、)、CMyWinPAppCMyWinPApp(应用程序类应用程序类)、)、CMyWinPDocCMyWinPDoc( 文档类文档类)和)和CMyWipViewCMyWipView( 视图类视图类)

13、等,这是应用程序)等,这是应用程序MyWinPMyWinP的全部类。的全部类。1.AppWizard向导生成的类和文件向导生成的类和文件 利用利用AppWizardAppWizard向导创建应用程序框架时,产生的各派生类将被创建单独的向导创建应用程序框架时,产生的各派生类将被创建单独的源文件。源文件。单击某一类名(如单击某一类名(如CMyWinPViewCMyWinPView)前的)前的“+”+”号,则列出该类的成员函数,双号,则列出该类的成员函数,双击类名或成员函数名击类名或成员函数名( (如如GetDocument)GetDocument),则源代码编辑区显示出该类或该成员,则源代码编辑区

14、显示出该类或该成员函数的实现代码。函数的实现代码。 观察应用程序观察应用程序MyWinP 的类和文件的类和文件NoImage MyWinPMyWinP程序的应用程序类名为程序的应用程序类名为CMyWinPApp CMyWinPApp ,由,由CwinAppCwinApp类派生而类派生而来。来。 该类的每一个对象代表一个应用程序,程序中默认定义一个全局该类的每一个对象代表一个应用程序,程序中默认定义一个全局对象对象theApptheApp。(1)应用程序类应用程序类 CMyWinPAppCMyWinPApp类的功能是类的功能是管理整个应用程序管理整个应用程序,负责程序的启动、初始化、,负责程序的

15、启动、初始化、窗口的创建以及从窗口的创建以及从WindowsWindows中获取消息并将消息分发到适当的目的地。中获取消息并将消息分发到适当的目的地。 CMyWinPAppCMyWinPApp类的声明在头文件类的声明在头文件MyWinPApp.hMyWinPApp.h中,类的实现在中,类的实现在CMyWinPApp.cppCMyWinPApp.cpp中。中。(1)应用程序类应用程序类 CMyWinP应用程序的主框架窗口类名为应用程序的主框架窗口类名为CMainFrame,它由,它由CWnd的一个子类派生而来,该子类即的一个子类派生而来,该子类即CFrameWnd。CMainFrame类的声明在

16、头文件类的声明在头文件MainFrame.h中,类的实现在文件中,类的实现在文件MainFrame.cpp中。中。(2)主框架架窗口类主框架架窗口类 CMainFrame类管理主框架窗口,并拥有一些如菜单、工具栏和类管理主框架窗口,并拥有一些如菜单、工具栏和状态栏等控件,同时,它还扮演转发菜单和工具栏消息的角色。状态栏等控件,同时,它还扮演转发菜单和工具栏消息的角色。 (2)主框架架窗口类主框架架窗口类 CMyWinPCMyWinP应用程序的文档类名为应用程序的文档类名为CMyWinPDocCMyWinPDoc,从,从MFCMFC的的CDocumentCDocument类派生而来。其类的声明在

17、头文件类派生而来。其类的声明在头文件CMyWinPDoc.hCMyWinPDoc.h中,类的实现在文件中,类的实现在文件CMyWinPDoc.cppCMyWinPDoc.cpp中。中。(3)文档类文档类 文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。用户需要修改文档类,增加成员变量以存储应用程序的数据、增用户需要修改文档类,增加成员变量以存储应用程序的数据、增加成员函数以获得和修改数据,然后为应用程序服务。加成员函数以获得和修改数据,然后为应用程序服务。 (3)文档类文档类 CMyWinPCMyWinP应用程序的视图类名为应

18、用程序的视图类名为CMyWinPViewCMyWinPView,类的声明在头文件,类的声明在头文件MyWinPView.hMyWinPView.h中,而类的实现在文件中,而类的实现在文件MyWinPView.cppMyWinPView.cpp中。中。(4)视图类视图类 视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。(4)视图类视图类 (5)其他文件其他文件 除以上主要类之外,除以上主要类之外,AppWizard还自动生成还自动生成Stdafx.cpp和和stdafx.h两个两个文件。文件。 这两个文件是每个基于这两个文件

19、是每个基于MFC程序所必需的,程序所必需的, 用于建立一个预编译头用于建立一个预编译头文件文件*.pch和一个预定义的类型文件和一个预定义的类型文件stdafx.obj。 MFC包含很多头文件,如果每次都编译则比较费时,将包含很多头文件,如果每次都编译则比较费时,将afxwin.h、afxext.h、afxcmn.h、afxdisp.h都放在都放在stdafx.h文件中,这样编译系统可以文件中,这样编译系统可以识别哪些文件已经编译过,以加速应用程序的编译过程。识别哪些文件已经编译过,以加速应用程序的编译过程。 12.3 输入输入/输出处理程序输出处理程序 输入输出处理是几乎所有输入输出处理是几

20、乎所有Windows应用程序最基本的功能之一应用程序最基本的功能之一 Windows应用程序通过对键盘消息和鼠标消息的响应完成对用户输应用程序通过对键盘消息和鼠标消息的响应完成对用户输入的处理入的处理通过通过GDI提供的绘图函数在窗口的客户区输出信息。提供的绘图函数在窗口的客户区输出信息。 1.文本输出程序 文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。 在在MFCMFC中,中,CDCCDC类实现了对设备环境的封装,类实现了对设备环境的封装,CDCCDC类有许多成员函数,类有许多成员函数,完成各种与设备环境有关的操作。完成各

21、种与设备环境有关的操作。 DrawText函数函数 DrawText函数是函数是CDC类用于文本输出的成员函数之一,它的作用是在指类用于文本输出的成员函数之一,它的作用是在指定矩形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。定矩形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。 DrawText函数的格式如下:函数的格式如下: 形式一:形式一:virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );形式二:形式二:int DrawText(const CStrin

22、g&str, LPRECT lpRect, UINT nFormat ); 参数含义参数含义参数参数1pszString1pszString是指向输出字符串的指针;是指向输出字符串的指针;参数参数nCountnCount指定字符串的长度,如果为指定字符串的长度,如果为-1-1,则,则1pszString1pszString是一个指向以是一个指向以nullnull结尾的字符串的长指针;结尾的字符串的长指针;参数参数lpRectlpRect是指向是指向RECTRECT结构的指针;结构的指针;参数参数nFormatnFormat用于指定输出格式;用于指定输出格式; strstr表示存储字符串

23、的表示存储字符串的CStringCString对象。对象。 TextOut函数 TextOutTextOut函数也是函数也是CDCCDC类用于文本输出的成员函数,它的作用是在指定的起点坐类用于文本输出的成员函数,它的作用是在指定的起点坐标上,以当前字体、颜色等属性显示字符串。标上,以当前字体、颜色等属性显示字符串。 TextOutTextOut函数格式函数格式 : 形式一:形式一:virtual int TextOut(int x,int y,LPCTSTR lpszString, int nCount);形式二:形式二: BOOL TextOut(int x,int y,const CStr

24、ing&str); 参数含义参数含义 参数参数x,yx,y表示欲显示字符串起点坐标;表示欲显示字符串起点坐标;参数参数lpszStringlpszString指向要显示字符串的指针;指向要显示字符串的指针;参数参数nCountnCount指定字符串的长度;指定字符串的长度; strstr存储字符串的存储字符串的CStringCString对象。对象。 OnDraw函数 void OnDraw(CDC *pDC) OnDrawOnDraw函数是视图类的一个重要成员函数。函数是视图类的一个重要成员函数。成员函数成员函数OnDrawOnDraw管理文档类成员变量的显示,即管理文档类成员变量的

25、显示,即OnDrawOnDraw函数主要用于更新函数主要用于更新视图窗口。视图窗口。 GetDocument函数函数 GetDocument函数返回一个指向关联文档对象的指针。函数返回一个指向关联文档对象的指针。通过通过GetDocument函数返回的文档对象指针,视图对象可以调用文档类函数返回的文档对象指针,视图对象可以调用文档类及其派生类的成员函数或直接读取文档对象的公有数据成员,获取应用程及其派生类的成员函数或直接读取文档对象的公有数据成员,获取应用程序的数据。序的数据。GetDocument函数的格式如下:函数的格式如下:CDocument *GetDocument() const 2

26、 键盘输入处理程序键盘输入处理程序 Windows环境下接受到按键消息的窗口称为环境下接受到按键消息的窗口称为“有输入焦点有输入焦点”的窗口。的窗口。 键盘消息键盘消息 在在Windows应用程序运行时若用户按下一个键,就会产生一个键盘消息,如:应用程序运行时若用户按下一个键,就会产生一个键盘消息,如: WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP 其中其中WM_SYSKEYDOWN、WM_SYSKEYUP中的中的SYS表示系统按键消息,表示系统按键消息,由由Windows处理,应用程序只需处理处理,应用程序只需处理WM_KEYDOWN和和WM_K

27、EYUP等非系统按等非系统按键消息。键消息。 afx_msg void OnChar(UNIT nChar,UINT nRepCnt, UINT nFlags) WM_CHAR的消息处理函数:的消息处理函数: nChar表示按键的字符代码值;表示按键的字符代码值; nRepCnt表示按键的重复次数,因此若用户按下某键不放,该参数值将不断表示按键的重复次数,因此若用户按下某键不放,该参数值将不断增加;增加; nFlags用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等相关信息。相关信息。 虚拟键代码虚拟键代码 键盘上每一个有

28、意义的键都对应着一个惟一的标识值,即键盘扫描码,键盘上每一个有意义的键都对应着一个惟一的标识值,即键盘扫描码,当用户按下或释放一个按键时,都会产生扫描码。当用户按下或释放一个按键时,都会产生扫描码。扫描码是依赖于具体设备的。扫描码是依赖于具体设备的。Windows应用程序中一般使用与具体设备应用程序中一般使用与具体设备无关的虚拟码。无关的虚拟码。虚拟码是虚拟码是Windows系统内部定义的与设备无关的键盘标识,从而有效避系统内部定义的与设备无关的键盘标识,从而有效避免了键盘对应用程序的影响,提高了应用程序的通用性。免了键盘对应用程序的影响,提高了应用程序的通用性。 部分常用的虚拟键代码 虚拟键

29、代码虚拟键代码对应功能键对应功能键虚拟键代码虚拟键代码对应功能键对应功能键VK_INSERTInsertVK_DOWN(箭头向下箭头向下)VK_LEFT(左箭头左箭头)VK_NEXTPageDown键键VK_RIGHT(右箭头右箭头)VK_BACKBackSpace键键VK_UP(箭头向上箭头向上)VK_RETURNEnter键键VK_AZ字母字母AZVK_TABTab键键!显示键盘输入字符程序的实现方法!显示键盘输入字符程序的实现方法利用利用AppWizard向导生成项目名为向导生成项目名为MyWinKey的应用程序框架。的应用程序框架。向文档类中添加保存字符的数据成员向文档类中添加保存字符

30、的数据成员m_MyText(既可以利用向导添加,也既可以利用向导添加,也可以手工添加可以手工添加)。通过通过ClassWizard向导向视图类中添加消息处理函数向导向视图类中添加消息处理函数Onchar ,并建立消息,并建立消息映射。映射。编译并运行应用程序即可实现将键盘输入的字符在窗口客户区显示。编译并运行应用程序即可实现将键盘输入的字符在窗口客户区显示。 CClientDC Dc(this);/获得窗口客户区设备环境CCMyWinKeyDoc *pDoc=GetDocument();pDoc-m_MyText+=nChar;Dc.SetTextColor(RGB(0,0,255);Dc.T

31、extOut(0,0,pDoc-m_MyText);3. 鼠标处理程序 Windows应用程序的鼠标消息,可以被任何窗口接受应用程序的鼠标消息,可以被任何窗口接受 只要鼠标移动到该窗口并有鼠标按键消息,该窗口就可以接受到鼠标只要鼠标移动到该窗口并有鼠标按键消息,该窗口就可以接受到鼠标消息,消息, 与该窗口是否活动窗口或是否带有输入焦点没有关系。与该窗口是否活动窗口或是否带有输入焦点没有关系。 鼠标消息 鼠标在窗口客户区移动时产生鼠标在窗口客户区移动时产生WM_MOUSEMOVE消息消息.鼠标在客户区产生鼠标在客户区产生的消息由的消息由Windows应用程序处理,而在窗口边界、菜单、标题栏和滚动

32、条等非应用程序处理,而在窗口边界、菜单、标题栏和滚动条等非客户区产生的鼠标消息一般由客户区产生的鼠标消息一般由Windows系统处理。系统处理。 鼠标消息属于鼠标消息属于Windows消息消息鼠标消息均可直接利用鼠标消息均可直接利用Visual C+6.0的的ClassWizard向导添加鼠标消息处理向导添加鼠标消息处理函数函数与鼠标消息对应的消息处理函数如表与鼠标消息对应的消息处理函数如表12-3所示。所示。 消息处理函数消息处理函数 常用鼠标消息处理函数表 鼠标消息 消息处理函数 备注WM_MOUSEMOVEvoid OnM o use M o v e ( U IN T nFlags,CP

33、oint point)鼠标移动WM_LBUTTONDOWNvoid OnLButtonDown(UINT nFlags,CPoint point)单 击 鼠 标左键WM_MBUTTONDOWNvoid OnMButtonDown(UINT nFlags,CPoint point)单 击 鼠 标中键WM_RBUTTONDOWNvoid OnRButtonDown(UINT nFlags,CPoint point)单 击 鼠 标右键WM_LBUTTONUPvoid OnLButtonUp(UINT nFlags, CPoint point)鼠 标 左 键释放鼠标消息处理函数表(续)WM_MBUTT

34、ONUPvoid OnMButtonUp(UINT nFlags, CPoint point)鼠标中键鼠标中键释放释放WM_RBUTTONUPvoid OnRButtonUp(UINT nFlags, CPoint point)鼠标右键鼠标右键释放释放WM_LBUTTONDBLICKvoid OnLButtonDblClk(UINT nFlags, CPoint point)双击鼠标双击鼠标左键左键WM_MBUTTONDBLICKvoid OnMButtonDblClk(UINT nFlags, CPoint point)双击鼠标双击鼠标中键中键WM_RBUTTONDBLICKvoid OnR

35、ButtonDblClk(UINT nFlags, CPoint point)双击鼠标双击鼠标右键右键菜单和工具栏菜单和工具栏在在VC+VC+程序设计中,菜单和工具栏的设计过程相同,需要通过以下程序设计中,菜单和工具栏的设计过程相同,需要通过以下3 3个步个步骤实现:骤实现:(1 1)通过资源编辑器修改或建立菜单与工具栏。)通过资源编辑器修改或建立菜单与工具栏。(2 2)通过)通过MFCMFC向导建立各菜单项或工具命令按钮的消息响应函数。向导建立各菜单项或工具命令按钮的消息响应函数。(3 3)通过应用程序框架提供的菜单或工具栏加载命令,将菜单或工具栏加)通过应用程序框架提供的菜单或工具栏加载命

36、令,将菜单或工具栏加载到应用程序框架中。载到应用程序框架中。1 1 直接修改应用程序框架的菜单直接修改应用程序框架的菜单设计菜单,并通过菜单完成画线、画椭圆、画矩形设计菜单,并通过菜单完成画线、画椭圆、画矩形菜单设计过程如下菜单设计过程如下 1用菜单编辑器添加菜单栏及菜单项用菜单编辑器添加菜单栏及菜单项(1)打开项目文件)打开项目文件My.Dsw,选择工程管理窗口中的,选择工程管理窗口中的ResourceView标标签,展开签,展开My resources中的中的Menu菜单资源列表项,在其中可以见菜单资源列表项,在其中可以见到到IDR_MAINFRAME,它就是应用程序菜单的标识,双击该标识

37、将,它就是应用程序菜单的标识,双击该标识将在右边编辑窗口中见到它所代表的菜单内容。在右边编辑窗口中见到它所代表的菜单内容。图12-27NoImage1用菜单编辑器添加菜单栏及菜单项用菜单编辑器添加菜单栏及菜单项(2)右键单击图中)右键单击图中“帮助帮助”菜单后面的虚线框,将弹出属性对话框。菜单后面的虚线框,将弹出属性对话框。在在“C标题标题”编辑框中输入编辑框中输入“绘图绘图”。由于。由于“绘图绘图”是主菜单,选择是主菜单,选择它时并不需要执行任何程序功能,所以其属性对话框中的它时并不需要执行任何程序功能,所以其属性对话框中的“ID”是禁是禁用的。用的。1 直接修改应用程序框架的菜单图12-2

38、8(3)完成上面的步骤后,在)完成上面的步骤后,在“绘图绘图”菜单栏的下面将会出现虚线框,右键菜单栏的下面将会出现虚线框,右键单击它并将其单击它并将其“标题标题”设置为设置为“直线直线”,将其,将其“ID”设置为设置为“ID_LINE”。(4)用同样的方法在)用同样的方法在“直线直线”下面添加下面添加“矩形矩形”,“椭圆椭圆”菜单项,并将菜单项,并将矩形的矩形的ID设置为设置为“ID_RECT”,将椭圆的,将椭圆的ID设置为设置为“ID_ELLIPSE”。(5)修改或删除菜单栏中不需要的菜单,如删除其中的)修改或删除菜单栏中不需要的菜单,如删除其中的“帮助帮助”菜单,方菜单,方法是选中该菜单,

39、然后按法是选中该菜单,然后按Delete键或选择键或选择VC+“编辑编辑”菜单中的菜单中的“删除删除”命令。命令。1 直接修改应用程序框架的菜单直接修改应用程序框架的菜单上面的操作过程将建立如图所示的菜单。上面的操作过程将建立如图所示的菜单。1 直接修改应用程序框架的菜单直接修改应用程序框架的菜单2利用向导生成菜单消息响应函数利用向导生成菜单消息响应函数(1)按快捷键)按快捷键Ctrl+W键启动键启动MFC的类向导,如图所示。的类向导,如图所示。NoImage(2)选择类向导中的)选择类向导中的“Message Maps”标签,在标签,在“Class name”下拉列下拉列表中选择表中选择“C

40、MyView”类,在类,在“Object IDs”列表中具有所有的菜单标识,列表中具有所有的菜单标识,找到并选中找到并选中“ID_LINE”菜单标识,并选中菜单标识,并选中“Messages:”列表中的列表中的“COMMAND”,然后单击命令按钮,然后单击命令按钮“Add Function”。该操作会为。该操作会为CMyView类添加消息响应函数类添加消息响应函数OnLine。(3)用同样的方法为)用同样的方法为CMyView类增加类增加ID_RECT、ID_ELLIPSE和和ID_STUDENT菜单标识的消息响应函数:菜单标识的消息响应函数:OnRect、OnEllipse、OnStuden

41、t。 经过上述操作,经过上述操作,MFC向导会在向导会在CMyView类中完成下面的类中完成下面的3件事。件事。 向导将在向导将在CMyView类中添加消息响应函数的声明,如下所示:类中添加消息响应函数的声明,如下所示:class CMyView : public CView protected: afx_msg void OnLine(); afx_msg void OnEllipse(); afx_msg void OnRect(); afx_msg void OnStudent();向导添加的菜单消向导添加的菜单消息处理函数息处理函数 向导将在程序实现文件向导将在程序实现文件CMyVie

42、w.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()红字是向导添加的红字是向导添加的菜单消息映射宏菜

43、单消息映射宏2 2利用向导生成菜单消息响应函数利用向导生成菜单消息响应函数 向导将在类的程序文件向导将在类的程序文件CMyView.cppCMyView.cpp中添加消息处理函数的雏形,如下中添加消息处理函数的雏形,如下所示。所示。void CMyView:OnLine() / TODO: Add your command handler code here向导添加的菜单消向导添加的菜单消息处理函数雏形息处理函数雏形 在向导生成的消息处理函数中添加函数功能代码在向导生成的消息处理函数中添加函数功能代码void CMyView:OnLine()/选择选择“绘图绘图|直线直线”菜单执行该函数菜单执

44、行该函数 CClientDC dc(this);/获取设备环境获取设备环境 dc.MoveTo(50,100);/将光标移到将光标移到(50,100)位置位置 dc.LineTo(100,300);/从光标位置即从光标位置即(50,100)画直线到画直线到(100,300)void CMyView:OnEllipse()/选择选择“绘图绘图|椭圆椭圆”菜单执行该函数菜单执行该函数 CClientDC dc(this); dc.Ellipse(100,100,200,300);void CMyView:OnRect()/选择选择“绘图绘图|矩形矩形”菜单执行该函数菜单执行该函数 CClientD

45、C dc(this); dc.Rectangle(300,100,500,200);2 2 建立建立新菜单栏【例例】 为上一例重新建立一新菜单,实现同样的功能。为上一例重新建立一新菜单,实现同样的功能。实现过程简述如下实现过程简述如下 (1 1)在)在VC+VC+中打开例上例建立的项目文件中打开例上例建立的项目文件My.dswMy.dsw,在工程管理窗口,在工程管理窗口“ResourceView”ResourceView”中展开中展开“My resources”My resources”资源,右键单击资源,右键单击“Menu”,并从弹出的快捷菜单中选择并从弹出的快捷菜单中选择“Insert M

46、enu”,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)所示的对话框,选择)所示的

47、对话框,选择“Select Select an existing class”an existing class”,然后单击,然后单击“OK”OK”按钮,弹出如图按钮,弹出如图12-3312-33(b b)所)所示对话框,选择示对话框,选择“CMyView”CMyView”,然后单击,然后单击“Select”Select”按钮。按钮。3)通过消息映射向导“Message Maps”建立菜单项IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函数和函数代码,方法和代码同前例。4)加载新菜单。打开CMyApp:InitInstanceCMyApp:InitInstance函数,将其中建立单文档模板时指定的菜单标识IDR_MAINFRAMEIDR_MAINFRAME修改为新菜单的标识IDR_MENU1IDR_MENU1,如下所示。BOOL CMyApp:InitInstance() CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MENU1 , RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), RUNT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论