1MFC典型应用程序设计2本章主要内容:●Windows应用程序的消息处理机制●应用程序分析●输入/输出处理程序(文本输出、键盘及鼠标消息处理等)●菜单应用程序设计●工具栏应用程序设计●状态栏应用程序设计●对话框应用程序设计●控件应用程序设计●数据库应用程序设计312.1消息处理机制●Windows程序与其他程序最大的不同之处在于使用消息机制。●Windows程序中所发生的一切都可以用消息表示,消息用于告诉操作系统所发生的事情,如按键操作或鼠标操作等。●MFC应用程序也使用基于消息的事件驱动机制,而且MFC提供的消息处理机制使得用户可以更加方便、简易的处理消息。●在Windows中,所有消息都是通过消息名进行访问的,但不同类型的消息由应用程序的不同部分进行处理。41.MFC消息种类消息机制是Windows应用程序的核心,MFC中的消息可以分为:●Windows消息●控件通知消息●定时消息●命令消息5Windows消息●Windows消息通常指以WM开头的消息,但WM_COMMAND除外。●键盘消息和鼠标消息都属于Windows消息,Windows消息由窗口和视图进行处理。●Windows消息通常带有若干个参数传递给消息处理函数,这些参数为处理函数正确地处理消息提供了充分的信息。6●控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的消息。●MFC对控件通知消息的传递方式与其他以WM开头的Windows消息一样,但BN_CLICKED例外,该消息的传递方式与命令消息的传递机制相同。●对于Windows消息和控件通知消息,MFC将消息传递给相应的窗口处理。控件通知消息7定时消息●定时消息也是Windows的一类重要消息。●当需要应用程序每隔一个指定的时间间隔便执行某一特定操作时,就需要使用定时消息WM_TIMER。●在进行定时操作时,用户需要调用SetTimer函数创建一个定时器,并设置定时器的事件标志nIDEvent及时间间隔nElapse,然后编写消息WM_TIMER的消息处理函数OnTimer(),实现定时操作。8命令消息●命令消息是来自于用户界面对象的WM_COMMAND消息。●包括菜单、工具栏按钮和加速键都属于命令消息等。即每当用户选择一个菜单项、单击一个按钮或需要告诉操作系统应当执行什么操作时,则发送一条WM_COMMAND命令消息。●WM_COMMAND消息的消息映射宏为OnCommand()。所有命令消息都包含有一个相同类型的参数,即该命令消息需要操作的资源ID值,由ID值映射消息处理函数。92MFC消息映射机制●消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,它能找到处理该消息的函数。●消息映射是Windows基于消息映射的事件驱动机制的重要内容之一。10VisualC++的消息映射宏消息映射宏功能DECLARE_MESSAGE_MAP在头文件中使用,用于声明在源文件中存在消息映射BEGIN_MESSAGE_MAP表示消息映射的开始,用于源代码文件中END_MESSAGE_MAP表示消息映射的结束,用于源代码文件中ON_COMMAND将特定的命令消息映射到类的成员函数,即使用该成员函数处理消息ON_COMMAND_RANGE将一组特定的命令消息映射到类的成员函数11VisualC++的消息映射分为两个方面:●一是在头文件.h中处理●一是在实现文件.cpp中处理消息映射宏12消息映射举例以上一章所创建的应用程序MyWinP为例,打开该应用程序源代码,其中有以下关于消息映射的代码(见下页)。13在头文件MyWinp.h中的消息映射代码//{{AFX_MSG(CMyWinPApp)afx_msgvoidOnAppAbout();//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGDECLARE_MESSAGE_MAP()14在实现文件中的消息映射代码BEGIN_MESSAGE_MAP(CMyWinPApp,CWinApp)//{{AFX_MSG_MAP(CMyWinPApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)//NOTE-theClassWizardwilladdandremovemappingmacroshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSG_MAP//StandardfilebaseddocumentcommandsON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)//StandardprintsetupcommandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp::OnFilePrintSetup)END_MESSAGE_MAP()15消息映射宏的使用●宏DECLARE_MESSAGE_MAP用于类声明文件的结束处,即在.h文件的结束处。●宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP用于类的实现文件(.cpp)中实现消息映射,而且这两个宏必须配合使用。16●在BEGIN_MESSAGE_MAP与END_MESSAGE_MAP中间列出了消息映射的各个入口。例如,以下消息映射语句:ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)表示当用户单击了菜单项File|Open时,则发送WM_COMMAND消息,该消息找到此语句,发现资源ID值与资源ID_FILE_OPEN匹配,则执行该语句中指定的成员函数CWinApp::OnFileOpen()。消息映射宏的使用(续)17向导AppWizard生成的单文档应用程序一般包括四个基本类:●应用程序类●主框架窗口类●文档类和●视图类12.2应用程序分析181.AppWizard向导生成的类和文件●单击项目工作区的ClassView标签,则显示CMainFrame、CMyWinPApp、CMyWinPDoc和CMyWipView等,这是应用程序MyWinP的全部类。●利用AppWizard向导创建应用程序框架时,产生的各派生类将被创建单独的源文件。●单击某一类名(如CMyWinPView)前的“+”号,则列出该类的成员函数,双击类名或成员函数名(如GetDocument),则源代码编辑区显示出该类或该成员函数的实现代码。19观察应用程序MyWinP的类和文件20●MyWinP程序的应用程序类名为CMyWinPApp,由CwinApp类派生而来。●该类的每一个对象代表一个应用程序,程序中默认定义一个全局对象theApp。●CMyWinPApp类的功能是管理整个应用程序,负责程序的启动、初始化、窗口的创建以及从Windows中获取消息并将消息分发到适当的目的地。CMyWinPApp类的声明在头文件MyWinPApp.h中,类的实现在CMyWinPApp.cpp中。(1)应用程序类21●CMyWinP应用程序的主框架窗口类名为CMainFrame,它由CWnd的一个子类派生而来,该子类即CFrameWnd。●CMainFrame类的声明在头文件MainFrame.h中,类的实现在文件MainFrame.cpp中。●CMainFrame类管理主框架窗口,并拥有一些如菜单、工具栏和状态栏等控件,同时,它还扮演转发菜单和工具栏消息的角色。(2)主框架架窗口类22●CMyWinP应用程序的文档类名为CMyWinPDoc,从MFC的CDocument类派生而来。其类的声明在头文件CMyWinPDoc.h中,类的实现在文件CMyWinPDoc.cpp中。●文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。●用户需要修改文档类,增加成员变量以存储应用程序的数据、增加成员函数以获得和修改数据,然后为应用程序服务。(3)文档类23●CMyWinP应用程序的视图类名为CMyWinPView,类的声明在头文件MyWinPView.h中,而类的实现在文件MyWinPView.cpp中。●视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。●在创建一个单文档应用程序时,也可以选择将视图类从非CView类的其他子类派生出来,例如,在BaseClass中选择CEditView作为基本视图类,则可以很方便的得到一个简易的字处理程序。(4)视图类24(5)其他文件●除以上主要类之外,AppWizard还自动生成Stdafx.cpp和stdafx.h两个文件。这两个文件是每个基于MFC程序所必需的,●用于建立一个预编译头文件*.pch和一个预定义的类型文件stdafx.obj。●MFC包含很多头文件,如果每次都编译则比较费时,将afxwin.h、afxext.h、afxcmn.h、afxdisp.h都放在stdafx.h文件中,这样编译系统可以识别哪些文件已经编译过,以加速应用程序的编译过程。252.应用程序的运行机制Windows应用程序的执行过程如下:●自动调用应用程序框架内的WinMain函数。WinMain()自动查找由CWinApp派生类构造函数创建的全局对象theApp。●WinMain函数调用调用Initlnstance成员函数,完成应用程序实例的初始化。●WinMain函数调用Run成员函数,进入消息循环。●WinMain函数退出,调用有关成员函数进行必要的清理工作,程序运行中止。2612.3输入/输出处理程序●输入输出处理是几乎所有Windows应用程序最基本的功能之一●Windows应用程序通过对键盘消息和鼠标消息的响应完成对用户输入的处理●通过GDI提供的绘图函数在窗口的客户区输出信息。271.文本输出程序文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。在MFC中,CDC类实现了对设备环境的封装,CDC类有许多成员函数,完成各种与设备环境有关的操作。28DrawText函数DrawText函数是CDC类用于文本输出的成员函数之一,它的作用是在指定矩形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。DrawText函数的格式如下:形式一:virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);形式二:intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);29参数含义●参数1pszString是指向输出字符串的指针;●参数nCount指定字符串的长度,如果为-1,则1pszString是一个指向以null结尾的字符串的长指针;●参数lpRect是指向RECT结构的指针;●参数nFormat用于指定输出格式;●str表示存储字符串的CString对象。30TextOut函数●TextOut函数也是CDC类用于文本输出的成员函数,它的作用是在指定的起点坐标上,以当前字体、颜色等属性显示字符串。●TextOut函数格式:形式一:virtualintTextOut(intx,inty,LPCTSTRlpszString,intnCount);形式二:BOOLTextOut(intx,inty,constCString&str);31参数含义●参数x,y表示欲显示字符串起点坐标;●参数lpszString指向要显示字符串的指针;●参数nCount指定字符串的长度;●str存储字符串的CString对象。32OnDraw函数voidOnDraw(CDC*pDC)●OnDraw函数是视图类的一个重要成员函数。●成员函数OnDraw管理文档类成员变量的显示,即OnDraw函数主要用于更新