面向对象程序设计与Visual.ppt
《面向对象程序设计与Visual.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计与Visual.ppt(93页珍藏版)》请在三一办公上搜索。
1、2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,1,第12章 MFC典型应用程序设计,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,2,本章主要内容:,Windows应用程序的消息处理机制应用程序分析输入/输出处理程序(文本输出、键盘及鼠标消息处理等)菜单应用程序设计工具栏应用程序设计状态栏应用程序设计对话框应用程序设计控件应用程序设计数据库应用程序设计,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,3,12.1 消息处理机制,Windows程序与其他程序最大的不同之处在于使用消息机制。Wind
2、ows程序中所发生的一切都可以用消息表示,消息用于告诉操作系统所发生的事情,如按键操作或鼠标操作等。MFC应用程序也使用基于消息的事件驱动机制,而且MFC提供的消息处理机制使得用户可以更加方便、简易的处理消息。在Windows中,所有消息都是通过消息名进行访问的,但不同类型的消息由应用程序的不同部分进行处理。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,4,1.MFC消息种类,消息机制是 Windows应用程序的核心,MFC中的消息可以分为:Windows消息 控件通知消息 定时消息 命令消息,2023年10月5日4时47分,面向对象程序设计与Visual
3、C+6.0教程,5,Windows消息,Windows消息通常指以WM开头的消息,但WM_COMMAND除外。键盘消息和鼠标消息都属于Windows消息,Windows消息由窗口和视图进行处理。Windows消息通常带有若干个参数传递给消息处理函数,这些参数为处理函数正确地处理消息提供了充分的信息。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,6,控件通知消息是指当控件的状态发生改变时,控件向其父窗口发送的消息。MFC对控件通知消息的传递方式与其他以WM开头的Windows消息一样,但BN_CLICKED例外,该消息的传递方式与命令消息的传递机制相同。对于W
4、indows消息和控件通知消息,MFC将消息传递给相应的窗口处理。,控件通知消息,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,7,定时消息,定时消息也是Windows的一类重要消息。当需要应用程序每隔一个指定的时间间隔便执行某一特定操作时,就需要使用定时消息WM_TIMER。在进行定时操作时,用户需要调用SetTimer函数创建一个定时器,并设置定时器的事件标志nIDEvent及时间间隔nElapse,然后编写消息WM_TIMER的消息处理函数OnTimer(),实现定时操作。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,
5、8,命令消息,命令消息是来自于用户界面对象的WM_COMMAND消息。包括菜单、工具栏按钮和加速键都属于命令消息等。即每当用户选择一个菜单项、单击一个按钮或需要告诉操作系统应当执行什么操作时,则发送一条WM_COMMAND命令消息。WM_COMMAND消息的消息映射宏为OnCommand()。所有命令消息都包含有一个相同类型的参数,即该命令消息需要操作的资源ID值,由ID值映射消息处理函数。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,9,2 MFC消息映射机制,消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,它能找到处理该消息的函数。消息映射是
6、Windows基于消息映射的事件驱动机制的重要内容之一。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,10,Visual C+的消息映射宏,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,11,Visual C+的消息映射分为两个方面:一是在头文件.h中处理 一是在实现文件.cpp中处理,消息映射宏,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,12,消息映射举例,以上一章所创建的应用程序MyWinP为例,打开该应用程序源代码,其中有以下关于消息映射的代码(见下页)。,2023年10月5日4时
7、47分,面向对象程序设计与Visual C+6.0教程,13,在头文件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_MSGDECLARE_MESSAGE_MAP(),2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,14,在实现文件
8、中的消息映射代码,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 file based document commandsON_COMMAND(ID_FILE_NEW,
9、CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_MAP(),2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,15,消息映射宏的使用,宏DECLARE_MESSAGE_MAP用于类声明文件的结束处,即在.h文件的结束处。宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP用于类的实现文
10、件(.cpp)中实现消息映射,而且这两个宏必须配合使用。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,16,在BEGIN_MESSAGE_MAP与END_MESSAGE_MAP中间列出了消息映射的各个入口。例如,以下消息映射语句:ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)表示当用户单击了菜单项File|Open时,则发送WM_COMMAND消息,该消息找到此语句,发现资源ID值与资源ID_FILE_OPEN匹配,则执行该语句中指定的成员函数CWinApp:OnFileOpen()。,消息映射宏的使用(续),2023
11、年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,17,向导AppWizard生成的单文档应用程序一般包括四个基本类:应用程序类主框架窗口类文档类和视图类,12.2 应用程序分析,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,18,1.AppWizard向导生成的类和文件,单击项目工作区的ClassView标签,则显示CMainFrame、CMyWinPApp、CMyWinPDoc和CMyWipView等,这是应用程序MyWinP的全部类。利用AppWizard向导创建应用程序框架时,产生的各派生类将被创建单独的源文件。单击某一类名(如C
12、MyWinPView)前的“+”号,则列出该类的成员函数,双击类名或成员函数名(如GetDocument),则源代码编辑区显示出该类或该成员函数的实现代码。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,19,观察应用程序MyWinP 的类和文件,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,20,MyWinP程序的应用程序类名为CMyWinPApp,由CwinApp类派生而来。该类的每一个对象代表一个应用程序,程序中默认定义一个全局对象theApp。CMyWinPApp类的功能是管理整个应用程序,负责程序的启动、初始化、窗口
13、的创建以及从Windows中获取消息并将消息分发到适当的目的地。CMyWinPApp类的声明在头文件MyWinPApp.h中,类的实现在CMyWinPApp.cpp中。,(1)应用程序类,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,21,CMyWinP应用程序的主框架窗口类名为CMainFrame,它由CWnd的一个子类派生而来,该子类即CFrameWnd。CMainFrame类的声明在头文件MainFrame.h中,类的实现在文件MainFrame.cpp中。CMainFrame类管理主框架窗口,并拥有一些如菜单、工具栏和状态栏等控件,同时,它还扮演转发菜
14、单和工具栏消息的角色。,(2)主框架架窗口类,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,22,CMyWinP应用程序的文档类名为CMyWinPDoc,从MFC的CDocument类派生而来。其类的声明在头文件CMyWinPDoc.h中,类的实现在文件CMyWinPDoc.cpp中。文档类的主要作用是保存应用程序的数据,并提供磁盘文件操作。用户需要修改文档类,增加成员变量以存储应用程序的数据、增加成员函数以获得和修改数据,然后为应用程序服务。,(3)文档类,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,23,CMyWinP应
15、用程序的视图类名为CMyWinPView,类的声明在头文件MyWinPView.h中,而类的实现在文件MyWinPView.cpp中。视图类主要管理视图窗口,负责用户数据的输入和数据的输出显示。在创建一个单文档应用程序时,也可以选择将视图类从非CView类的其他子类派生出来,例如,在Base Class中选择CEditView作为基本视图类,则可以很方便的得到一个简易的字处理程序。,(4)视图类,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,24,(5)其他文件,除以上主要类之外,AppWizard还自动生成Stdafx.cpp和stdafx.h两个文件。这两
16、个文件是每个基于MFC程序所必需的,用于建立一个预编译头文件*.pch和一个预定义的类型文件stdafx.obj。MFC包含很多头文件,如果每次都编译则比较费时,将afxwin.h、afxext.h、afxcmn.h、afxdisp.h都放在stdafx.h文件中,这样编译系统可以识别哪些文件已经编译过,以加速应用程序的编译过程。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,25,2.应用程序的运行机制,Windows应用程序的执行过程如下:自动调用应用程序框架内的WinMain函数。WinMain()自动查找由CWinApp派生类构造函数创建的全局对象th
17、eApp。WinMain函数调用调用Initlnstance成员函数,完成应用程序实例的初始化。WinMain函数调用Run成员函数,进入消息循环。WinMain函数退出,调用有关成员函数进行必要的清理工作,程序运行中止。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,26,12.3 输入/输出处理程序,输入输出处理是几乎所有Windows应用程序最基本的功能之一 Windows应用程序通过对键盘消息和鼠标消息的响应完成对用户输入的处理通过GDI提供的绘图函数在窗口的客户区输出信息。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教
18、程,27,1.文本输出程序,文本输出指在窗口客户区特定位置输出用户指定的相关文本信息。在MFC中,CDC类实现了对设备环境的封装,CDC类有许多成员函数,完成各种与设备环境有关的操作。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,28,DrawText函数,DrawText函数是CDC类用于文本输出的成员函数之一,它的作用是在指定矩形区域内以当前字体、颜色等属性及指定的显示方式显示字符串。DrawText函数的格式如下:,形式一:virtual int DrawText(LPCTSTR lpszString,int nCount,LPRECT lpRect,
19、UINT nFormat);形式二:int DrawText(const CString,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,29,参数含义,参数1pszString是指向输出字符串的指针;参数nCount指定字符串的长度,如果为-1,则1pszString是一个指向以null结尾的字符串的长指针;参数lpRect是指向RECT结构的指针;参数nFormat用于指定输出格式;str表示存储字符串的CString对象。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,30,TextOut函数,TextOut函数也是CDC
20、类用于文本输出的成员函数,它的作用是在指定的起点坐标上,以当前字体、颜色等属性显示字符串。TextOut函数格式:,形式一:virtual int TextOut(int x,int y,LPCTSTR lpszString,int nCount);形式二:BOOL TextOut(int x,int y,const CString,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,31,参数含义,参数x,y表示欲显示字符串起点坐标;参数lpszString指向要显示字符串的指针;参数nCount指定字符串的长度;str存储字符串的CString对象。,2023年
21、10月5日4时47分,面向对象程序设计与Visual C+6.0教程,32,OnDraw函数,void OnDraw(CDC*pDC),OnDraw函数是视图类的一个重要成员函数。成员函数OnDraw管理文档类成员变量的显示,即OnDraw函数主要用于更新视图窗口。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,33,GetDocument函数,GetDocument函数返回一个指向关联文档对象的指针。通过GetDocument函数返回的文档对象指针,视图对象可以调用文档类及其派生类的成员函数或直接读取文档对象的公有数据成员,获取应用程序的数据。GetDocu
22、ment函数的格式如下:,CDocument*GetDocument()const,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,34,2 键盘输入处理程序,键盘是Windows应用程序一个非常重要的输入手段,当用户按下或释放一个按键时,键盘驱动程序KEYBOARD.DRV中的键盘中断程序将对按键进行编码,并由用户模块USER.EXE生成键盘消息,最终发送到消息队列中等待处理,而处理键盘消息则是由应用程序的窗口来具体完成的。在Windows系统下,键盘由所有运行的应用程序共享,但不管用户打开了多少个应用程序,任何情况下只有一个窗口能接受到按键消息。Window
23、s环境下接受到按键消息的窗口称为“有输入焦点”的窗口。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,35,键盘消息,在Windows应用程序运行时若用户按下一个键,就会产生一个键盘消息,如:WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP 其中WM_SYSKEYDOWN、WM_SYSKEYUP中的SYS表示系统按键消息,由Windows处理,应用程序只需处理WM_KEYDOWN和WM_KEYUP等非系统按键消息。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,36,afx_msg v
24、oid OnChar(UNIT nChar,UINT nRepCnt,UINT nFlags),WM_CHAR的消息处理函数:,nChar表示按键的字符代码值;nRepCnt表示按键的重复次数,因此若用户按下某键不放,该参数值将不断增加;nFlags用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等相关信息。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,37,虚拟键代码,键盘上每一个有意义的键都对应着一个惟一的标识值,即键盘扫描码,当用户按下或释放一个按键时,都会产生扫描码。扫描码是依赖于具体设备的。Windows应用程序中一般使用与具体设备无关的
25、虚拟码。虚拟码是Windows系统内部定义的与设备无关的键盘标识,从而有效避免了键盘对应用程序的影响,提高了应用程序的通用性。,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,38,部分常用的虚拟键代码,2023年10月5日4时47分,面向对象程序设计与Visual C+6.0教程,39,显示键盘输入字符程序的实现方法,利用AppWizard向导生成项目名为MyWinKey的应用程序框架。在应用程序框架中添加保存字符的数据成员(既可以利用向导添加,也可以手工添加)。在应用程序框架中通过ClassWizard向导添加消息处理函数。编译并运行应用程序即可实现将键盘输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 Visual

链接地址:https://www.31ppt.com/p-6213419.html