MFC电子课件:实践教程第三章第二版

上传人:努力****83 文档编号:166943880 上传时间:2022-11-01 格式:PPT 页数:180 大小:1.46MB
收藏 版权申诉 举报 下载
MFC电子课件:实践教程第三章第二版_第1页
第1页 / 共180页
MFC电子课件:实践教程第三章第二版_第2页
第2页 / 共180页
MFC电子课件:实践教程第三章第二版_第3页
第3页 / 共180页
资源描述:

《MFC电子课件:实践教程第三章第二版》由会员分享,可在线阅读,更多相关《MFC电子课件:实践教程第三章第二版(180页珍藏版)》请在装配图网上搜索。

1、第三章第三章 MFCMFC程序设计程序设计本章的内容,简洁而不失完整性:由应用程序向导本章的内容,简洁而不失完整性:由应用程序向导建立程序框架,由资源编辑器建立用户界面,由建立程序框架,由资源编辑器建立用户界面,由类向导建立成员变量、消息映射和处理函数,加类向导建立成员变量、消息映射和处理函数,加上文档序列化和注册上文档序列化和注册 MFC包含了所有与系统相关的类包含了所有与系统相关的类(包括图形用户界面相关的包括图形用户界面相关的类类),其中封装了大多数的,其中封装了大多数的API函数,提供了应用程序框架函数,提供了应用程序框架和开发应用程序的工具如应用程序向导、类向导、可视化和开发应用程序

2、的工具如应用程序向导、类向导、可视化资源设计等高效工具,用消息映射处理消息响应,大大简资源设计等高效工具,用消息映射处理消息响应,大大简化了化了Windows应用程序的开发工作,使程序员可以从繁应用程序的开发工作,使程序员可以从繁重的编程工作中解脱,提高工作效率。重的编程工作中解脱,提高工作效率。目录目录3.1 MFC程序设计简介程序设计简介 MFC类库类库 基础类基础类 (已在第二章中介绍)(已在第二章中介绍)宏、全局变量及全局函数宏、全局变量及全局函数应用程序框架应用程序框架3.1.1 MFC定义的宏、全局函数及全局变量定义的宏、全局函数及全局变量类库类库1.MFC1.MFC提供的主要宏:

3、提供的主要宏:消息映射宏:声明消息映射表宏声明消息映射表宏DECLARE_MESSAGE_MAPDECLARE_MESSAGE_MAP、消、消息映射定义宏息映射定义宏BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP和和END_MESSAGE_MAPEND_MESSAGE_MAP消息映消息映射表入口宏射表入口宏ON_ON_消息名。消息名。(本章只介绍消息映射宏本章只介绍消息映射宏)3.1.1 MFC定义的宏、全局函数及全局变量定义的宏、全局函数及全局变量 动态动态MFCMFC对象宏对象宏 DECLARE_DYNAMIC和和IMPLEMENT_DYNAMIC动态创建对象宏动态创

4、建对象宏 DECLARE_DYNCREATE和和IMPLEMENT_DYNCREATE运行时类宏:运行时类宏:RUNTIME_CLASS序列化宏:序列化宏:DECLARE_SERIAL和和IMPLEMENT_SERIAL诊断服务宏:诊断服务宏:ASSERT、VERIFY 跟踪服务宏:跟踪服务宏:TRACE异常处理宏:异常处理宏:THROW 3.1.1 MFC定义的宏、全局函数及全局变量定义的宏、全局函数及全局变量MFCMFC提供一些不属于任何类的全局函数,函数名以提供一些不属于任何类的全局函数,函数名以AfxAfx开开头,可以被应用程序中的所有类和函数所调用。如:头,可以被应用程序中的所有类和

5、函数所调用。如:AfxAbortAfxAbort()(),无条件终止一个应用程序的执行;,无条件终止一个应用程序的执行;AfxGetAppNameAfxGetAppName()(),返回指向应用程序名的字符串指针;,返回指向应用程序名的字符串指针;AfxWinInitAfxWinInit()(),由由WinMainWinMain()()调用,对调用,对MFCMFC应用程序进行图应用程序进行图形用户界面形用户界面(GUI)(GUI)的初始化等等。的初始化等等。3.3.全局变量全局变量 全局变量名以afx开头,如afxTraceFlag、afxDumpafxDump等,主要与异常处理有关。2.2.

6、全局函数全局函数3.1.2 MFC命名规则命名规则 匈牙利命名法规定匈牙利命名法规定:变量名以一个或多个小写字母开头作为变量名以一个或多个小写字母开头作为前缀,标识变量的数据类型;前缀,标识变量的数据类型;类型标识后是若干个单词,标识变量含义,类型标识后是若干个单词,标识变量含义,每个单词以大写字母开头,其余字母小写;每个单词以大写字母开头,其余字母小写;MFCMFC中所有类及自定义类都以中所有类及自定义类都以C C开头;开头;类成员变量以类成员变量以m_m_为前缀,下划线后是变为前缀,下划线后是变量名等等。量名等等。前缀数据类型例B,bBOOLbIsValidChcharChText,ChG

7、radecclasscStringCsCStringCsNameDwDWORDDwFlagsfnfunctionfnSorthandlehWnd,hPeniintiCountppointerpFrameszASCII stringszNamem_Data memberm_szName表3.1 命名规则h MFCMFC提供了构造提供了构造WindowsWindows应用程序的框架,它不应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列起动文仅为应用程序建立标准的结构,生成一系列起动文件,还提供标准的图形用户界面如菜单、工具栏、件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员

8、在程序中补充完善,开发人员状态条等供开发人员在程序中补充完善,开发人员只需要完成针对特定应用的代码。使用应用程序框只需要完成针对特定应用的代码。使用应用程序框架的应用程序代码小,运行速度快,它提供的工具架的应用程序代码小,运行速度快,它提供的工具也降低了编码的难度。也降低了编码的难度。3.1.3 应用程序框架介绍应用程序框架介绍 程序的数据储存在文档类中(作为文档类的数据成员),是程序的数据储存在文档类中(作为文档类的数据成员),是对数据的抽象表示。数据显示由视图负责,视图是程序对数据的抽象表示。数据显示由视图负责,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显窗口的客户区,框架窗

9、口是客户区的框架,程序数据显示在窗口,用户通过视图与程序交互。示在窗口,用户通过视图与程序交互。一个文档可以对应多个不同视图;而一个视图一般只对应一一个文档可以对应多个不同视图;而一个视图一般只对应一个文档。当文档数据发生变化时,视图显示的状态也会个文档。当文档数据发生变化时,视图显示的状态也会随之变化;对于多个视图的情况,基于同一文档的多个随之变化;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。视图的显示同步变化。1.文档文档-视图结构视图结构 文档视图结构提供一种连续处理数据的方式,文档视图结构提供一种连续处理数据的方式,使应用程序的数据与数据的显示分开处理。使应用程序的数据与

10、数据的显示分开处理。文档、视图及框架的关系:文档、视图及框架的关系:框架窗口对象框架窗口对象文档与视图之间文档与视图之间的双向数据交换的双向数据交换发送至视图发送至视图对象的消息对象的消息文档对象文档对象(保存程序保存程序数据数据)应用程应用程序对象序对象视图对象发送至框架发送至框架窗口的消息窗口的消息图图3.12.单文档界面应用单文档界面应用 单文档界面应用程序简称单文档界面应用程序简称SDI(Single Document SDI(Single Document Interface)Interface),只允许一个框架窗口存在,每次,只允许一个框架窗口存在,每次只能创建和拥有一个文档对象,

11、也只允许打开只能创建和拥有一个文档对象,也只允许打开一个文档。一个文档。SDISDI各类各类 关系图关系图可将文档比作一个文件袋,专门用于保存文件可将文档比作一个文件袋,专门用于保存文件数据,需要看时需从文件袋数据,需要看时需从文件袋(文档文档)中取出来,中取出来,放到桌面放到桌面(视图视图)上看。上看。表表3.2 3.2 基于文档基于文档/视图关系的视图关系的SDISDI应用中的类应用中的类DocumentDocument文档类文档类储存与应用程序相关的数据储存与应用程序相关的数据View View 视图类视图类决定文档数据的显示方式,提供用户界面决定文档数据的显示方式,提供用户界面Fram

12、e windowFrame window框架窗口框架窗口派生自派生自CFrameWndCFrameWnd,为为CWinAppCWinApp类的类的m_pMainWnd成员赋值成员赋值Document Document templatetemplate文文档模板档模板CSingelDocTemplateCSingelDocTemplate类对象,用构造函数类对象,用构造函数将文档、视图、框架窗口及用户界面资将文档、视图、框架窗口及用户界面资源联系在一起,创建并管理文档源联系在一起,创建并管理文档ApplicationApplication应用程序类应用程序类代表应用程序,代表应用程序,拥有指向文

13、档管理类的指拥有指向文档管理类的指针,管理应用程序中所有文档模板,针,管理应用程序中所有文档模板,负负责初始化和退出清理工作责初始化和退出清理工作返回返回应用程序类应用程序类框架类框架类(窗口框架窗口框架)资源资源(决定用户决定用户界面的显示界面的显示)视图类视图类(显示数据并显示数据并与用户交互与用户交互)文档类文档类(保存数据保存数据)单文档模板单文档模板返回返回应用程序类应用程序类CDocManager*m_pDocManager框架类框架类(窗口框架窗口框架)资源资源(决定用户决定用户界面的显示界面的显示)m_pDocument视图类视图类(显示数据显示数据并与用户交互并与用户交互)文

14、档类文档类(保存数据保存数据)m_pDocTemplatem_viewList返回返回单文档模板单文档模板CRuntimeClass*m_pDocClassCRuntimeClass*m_pFrameClassCRuntimeClass*m_pViewClassUINT m_nIDResource多文档界面应用简称多文档界面应用简称MDI(MultipleMDI(Multiple Document Document Interface)Interface),允许有多个文档类、视图类和多个文,允许有多个文档类、视图类和多个文档模板档模板CMultiDocTemplateCMultiDocTemp

15、late(建立多种文档建立多种文档-视图视图-子子框架关系框架关系)存在,运行时允许打开多个存在,运行时允许打开多个MDIMDI子框架窗子框架窗口,拥有各自的文档和视图对象。口,拥有各自的文档和视图对象。示例示例 关系图关系图在打开的多个子窗口中,只有一个活动窗口,应在打开的多个子窗口中,只有一个活动窗口,应用程序菜单和工具栏的所有的命令都是针对活用程序菜单和工具栏的所有的命令都是针对活动窗口的。动窗口的。3.3.多文档界面应用多文档界面应用子框架子框架 资源资源2视图类视图类2文档类文档类2文档模板文档模板2子框架子框架 资源资源1视图类视图类1文档类文档类1文档模板文档模板1主主框框架架其

16、它文档模其它文档模板板返回返回CDocManager应用程序类应用程序类CDocManager*m_pDocManager文档文档/视图结构视图结构可以充分发挥应用程序框架和可以充分发挥应用程序框架和MFCMFC的优势,是的优势,是MFCMFC应用程序的核心,但使用它也要付应用程序的核心,但使用它也要付出运行效率和代码增大的代价。出运行效率和代码增大的代价。文档文档/视图结构对应用程序来说并不是必不可少视图结构对应用程序来说并不是必不可少的,有两种常见的非文档的,有两种常见的非文档/视图结构应用。视图结构应用。4.非文档非文档/视图结构应用视图结构应用常见非文档常见非文档/视图结构应用:视图结

17、构应用:(1).(1).基于对话框的应用,它包含一个基于对话框的应用,它包含一个CWinAppCWinApp对对象和一个模态对话框,对话框负责数据的存储象和一个模态对话框,对话框负责数据的存储和显示和显示 。关系图(2).(2).SDISDI或或MDIMDI应用,都可以不包含文档对象,应用,都可以不包含文档对象,SDISDI包含一个包含一个CWinAppCWinApp对象,一个框架窗口对对象,一个框架窗口对象和一个从象和一个从CWndCWnd派生的派生的CChildViewCChildView视图对象,视图对象,视图对象负责数据的显示,视图对象负责数据的显示,MDIMDI应用还包括一应用还包括

18、一个子框架窗口。个子框架窗口。对话框类对话框类作为应用程序主窗口作为应用程序主窗口负责保存和显示数据负责保存和显示数据应用程序类应用程序类返回返回Dialog-based Application主框架,应用程序主窗口主框架,应用程序主窗口CChildView视图类视图类负责保存和显示数据负责保存和显示数据应用程序类应用程序类SDI Application,None Doc/View 返回返回子框架,子框架,视图框架窗口视图框架窗口CChildView视图类视图类应用程序类应用程序类子框架,子框架,视图框架窗口视图框架窗口CChildView视图类视图类主框架,应用程序主框架窗口主框架,应用程序

19、主框架窗口MDI Application,None Doc/View 返回返回图图3.2 MFC应用程序开发过程应用程序开发过程 类向导类向导集成开发环境集成开发环境应用程序向导应用程序向导资源编辑器资源编辑器Create.def.cpp.h.dsw.dsp.ico.rc.bmp源文件源文件资源文件资源文件编译编译.objBuild资源编译资源编译.res应用程序应用程序5.MFC应用程序创建应用程序创建 6.最简单的最简单的MFC应用程序示例应用程序示例 对于一个对于一个MFCMFC应用程序来说,只有应用程序来说,只有CWinAppCWinApp的派生对的派生对象是必不可少的,其它类均可视情

20、况进行取舍。象是必不可少的,其它类均可视情况进行取舍。下例是一个最简单的下例是一个最简单的MFCMFC应用程序。应用程序。例:显示一个消息框。例:显示一个消息框。(1).(1).创建工程,工程类型选择创建工程,工程类型选择Win32 ApplicationWin32 Application,工程名,工程名为为Ex3_0Ex3_0;(2).(2).创建创建C+C+源文件,文件名源文件,文件名Ex3_0.cppEx3_0.cpp,内容如下,内容如下:#include class CEx3_0App:public CWinApp /CWinApp/CWinApp派生类派生类 public:virtu

21、al BOOL InitInstance()MessageBox(NULL,”SimplistMFC Application.”,”Ex3_0”,MB_OK);return TRUE;CEx3_0App theApp;/全局变量,代表应用程序本身全局变量,代表应用程序本身 CWinApp:InitInstanceCWinApp:InitInstance()()虚函数完成应用程序的初始化工作,派生的虚函数完成应用程序的初始化工作,派生的应用程序类都要重载此函数进行初始化,如完成主框架窗口的构造,应用程序类都要重载此函数进行初始化,如完成主框架窗口的构造,窗口定义显示等工作。窗口定义显示等工作。(

22、3).(3).设置使用设置使用MFCMFC。选择选择Project|SettingsProject|Settings菜单项,选择菜单项,选择GeneralGeneral页面,在页面,在Microsoft Foundation ClassesMicrosoft Foundation Classes组合框中选择组合框中选择Use MFC in a shared DLLUse MFC in a shared DLL。(4).(4).编译生成并运行此工程,结果显示一个消息框编译生成并运行此工程,结果显示一个消息框,如下如下图图:图图3.3 3.3 最简单最简单MFCMFC应用示例应用示例3.2.MFC

23、 3.2.MFC 程序设计程序设计 MFCMFC应用程序的执行过程应用程序的执行过程(参见图参见图3.4):):1.1.构造全局对象构造全局对象CWinAppCWinApp派生类对象;派生类对象;2.2.运行由应用程序框架提供的运行由应用程序框架提供的WinMainWinMain函数;函数;图图3.4 MFC3.4 MFC应用程序的执行过程应用程序的执行过程3.在在WinMain中,通过中,通过afxGetApp()获得全局对象的指针获得全局对象的指针pApp,调用全局函数,调用全局函数AfxWinInit(),为为CWinApp的成员的成员变量变量m_hInstance,m_hPrevIns

24、tance,m_lpCmdLine,m_nCmdShow赋初值;赋初值;然后调用然后调用pApp-InitApplication(),这是,这是CWinApp的的虚函数,一般不需要改写;虚函数,一般不需要改写;调用调用 pApp-InitInstance(),每个程序都必需改写这,每个程序都必需改写这个函数,进行应用程序初始化;个函数,进行应用程序初始化;4.在在InitInstance()函数中,先用函数中,先用new构造一个构造一个CFrameWnd派生类对象,其构造函数又调用派生类对象,其构造函数又调用Create(),创建主窗口,创建主窗口,MFC依此自动为应用程序注册窗口类;依此自动

25、为应用程序注册窗口类;调用调用ShowWindow()显示窗口,调用显示窗口,调用UpdateWindow(),发出发出WM_PAINT消息;消息;5.5.回到回到WinMainWinMain中,调用中,调用pApp-Run,进入消息循环,通过,进入消息循环,通过APIAPI函数函数GetMessage()获得消息,获得消息,TranslateMessage()处处理消息,理消息,DispatchMessage()派送消息到派送消息到CWnd:DefWindowProc(),DefWindowProc()按照消息按照消息映射表的定义将消息分发到各相应消息处理函数;映射表的定义将消息分发到各相应

26、消息处理函数;如消息队列为空,则如消息队列为空,则RunRun调用调用CWinApp:OnIdle()进行空闲处进行空闲处理,重载理,重载OnIdle()可以去处理后台程序可以去处理后台程序(低优先级低优先级););6.6.若用户选择菜单若用户选择菜单File/CloseFile/Close,则程序收到,则程序收到WM_COLSEWM_COLSE消息消息,调用,调用:DestroyWindow()发出发出WM_DESTROY消息,然后消息,然后调调PostQuitMessage(),发出,发出WM_QUIT消息,此时消息,此时Run会会结束其内部消息循环,调用结束其内部消息循环,调用ExitI

27、nstance();7.最后,返回最后,返回WinMain(),执行,执行WinTerm(),结束程序运行。,结束程序运行。几点解释:几点解释:(1).(1).每个每个MFCMFC应用都有应用都有stdafx.hstdafx.h头文件,由应用程序向导自头文件,由应用程序向导自动生成;动生成;(2).(2).每个每个MFCMFC应用都应包含头文件应用都应包含头文件afxwin.hafxwin.h,其内部又包,其内部又包含了其他头文件。含了其他头文件。(3).(3).每一个每一个MFCMFC应用程序都包含唯一的应用程序都包含唯一的CWinAppCWinApp派生类派生类对象对象,代表应用程序本身。

28、代表应用程序本身。(4).MFC(4).MFC应用程序中看不到应用程序中看不到WinMainWinMain()()入口函数,它被入口函数,它被封装在应用程序框架里,运行时自动调用;封装在应用程序框架里,运行时自动调用;3.2.2.MFC3.2.2.MFC消息映射消息映射 消息映射消息映射(Message Map)(Message Map)机制机制:消息映射机制规定每个要响应消息的类定义自消息映射机制规定每个要响应消息的类定义自己的消息映射表,将消息与处理消息的函数己的消息映射表,将消息与处理消息的函数联系在一起;当事件发生产生消息时,在程联系在一起;当事件发生产生消息时,在程序中各个类的消息映

29、射表中查找,当找到消序中各个类的消息映射表中查找,当找到消息处理函数时,便将消息送至对应的消息处息处理函数时,便将消息送至对应的消息处理函数进行处理。每个从理函数进行处理。每个从CCmdTargetCCmdTarget所派生所派生的类都可以接收消息,都可以定义自己的消的类都可以接收消息,都可以定义自己的消息映射表息映射表Message MapMessage Map。消息映射表:消息映射表:1.消息消息 消息是消息是WindowsWindows用来通知用来通知MFCMFC应用程序事件发生的主应用程序事件发生的主要方式,应用程序的行为取决于对消息的响应方要方式,应用程序的行为取决于对消息的响应方式

30、。式。MFCMFC把消息分为三大类把消息分为三大类:(1).(1).标准标准WindowsWindows消息消息(窗口消息窗口消息)(WM_XXX)(WM_XXX),(2).(2).命令消息命令消息(WM_COMMAND),(WM_COMMAND),(3).(3).控件通知消息。控件通知消息。2.消息映射消息映射 消息映射将消息与应用程序提供的处理该消息消息映射将消息与应用程序提供的处理该消息的成员函数联系在一起,一组消息映射构成的成员函数联系在一起,一组消息映射构成消息映射表。消息映射表。消息映射表由消息映射表由BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP和和END_

31、MESSAGE_MAPEND_MESSAGE_MAP 这一对宏作开始和结束,这一对宏作开始和结束,中间是若干消息映射入口中间是若干消息映射入口每一个入口由特定的消息宏每一个入口由特定的消息宏ON_XXXON_XXX组成,将一组成,将一个消息与与之对应的处理函数联系在一起。个消息与与之对应的处理函数联系在一起。定义和使用消息映射表的步骤:定义和使用消息映射表的步骤:在头文件的类声明中添加在头文件的类声明中添加DECLARE_MESSAGE_MAP宏声明消息映射宏声明消息映射;例如例如 在类的定义文件在类的定义文件(.cpp)定义消息映射表,方法是定义消息映射表,方法是在在 文件的开始处添加文件的

32、开始处添加BEIGN_MESSAGE_MAP和和END_MESSAGE_MAP 这一对宏,在它们之间放置这一对宏,在它们之间放置消息映射宏,定义并初始化消息映射表,在消息与处消息映射宏,定义并初始化消息映射表,在消息与处理消息的函数之间建立联系;理消息的函数之间建立联系;例如例如 在类的定义文件在类的定义文件(.cpp)中添加消息处理函数。中添加消息处理函数。例如例如消息宏:消息宏:(1).对标准Windows消息(窗口消息)的响应 消息宏消息宏ON_WM_XXX定义对标准定义对标准Windows消息消息WM_XXX的响应,所有派生自的响应,所有派生自CWnd的类均可响应这类消息,系统默认的类

33、均可响应这类消息,系统默认的响应函数为的响应函数为OnXxx,对应关系见下面的表,对应关系见下面的表3.3:宏名宏名消息消息默认处理函数默认处理函数ON_WM_CHARWM_CHAROnCharON_WM_ CLOSEWM_ CLOSEOnCloseON_WM_CREATEWM_ CREATEOnCreateON_WM_LBUTTONDOWNWM_ LBUTTONDOWNOnLButtonDownON_WM_LBUTTONUPWM_ LBUTTONUPOnLButtonUpON_ WM_MOUSEMOVEWM_ MOUSEMOVEOnMouseMove由于由于有系统默认的消息和处理函数有系统默

34、认的消息和处理函数,在消息映射表中只写宏名,如:,在消息映射表中只写宏名,如:ON_WM_CREATE()(2).对命令消息的的响应对命令消息的的响应 。ON_COMMAND宏定义对命令消息的响应,格式为宏定义对命令消息的响应,格式为ON_COMMAND(命令命令ID,响应函数响应函数)举例如下:举例如下:ON_COMMAND(IDM_ABOUT,OnAbout)/表示表示IDM_ABOUT消息由消息由OnAbout()响应响应ON_COMMAND(IDM_FILENEW,OnFileNew)ON_COMMAND(IDM_FILEOPEN,OnFileOpen)所有由用户定义的命令消息也由所有

35、由用户定义的命令消息也由ON_COMMAND定义定义消息映射关系。消息映射关系。(3).对控件消息的响应对控件消息的响应 控件消息由按钮控件消息由按钮(BN_)、编辑框、编辑框(EN_)、组合框、组合框(CBN_)、列表框、列表框(LBN_)等产生,在消息名前加上等产生,在消息名前加上ON_即构成宏名,即构成宏名,举例如下:举例如下:ON_BN_CLICKED(按钮按钮ID,响应函数响应函数)ON_CBN_DBCLK(组合框组合框ID,响应函数响应函数)ON_EN_SETFOCUS(编辑框编辑框ID,响应函数响应函数)ON_LBN_DBCLK(列表框列表框ID,响应函数响应函数)分别表示选择各

36、个控件后,产生的消息由其后面定义分别表示选择各个控件后,产生的消息由其后面定义的函数进行处理。的函数进行处理。3.消息处理消息处理消息一般由应用程序中对象的成员函数来响应。当消息一般由应用程序中对象的成员函数来响应。当某个事件发生后,系统向应用程序消息队列放入某个事件发生后,系统向应用程序消息队列放入一个消息,一个消息,CWinAppCWinApp对象取得消息并按照消息映射对象取得消息并按照消息映射表的定义将消息派送到某个类的相应的消息处理表的定义将消息派送到某个类的相应的消息处理函数进行处理。函数进行处理。使用使用ClassWizardClassWizard(见第五章菜单中见第五章菜单中Vi

37、ewView菜单介绍菜单介绍)定义消息映射关系,添加消息处理函数,定义消息映射关系,添加消息处理函数,系统会系统会自动生成函数原型和函数框架,开发人员只要添自动生成函数原型和函数框架,开发人员只要添加函数体代码加函数体代码,可以避免一些常见错误的产生。,可以避免一些常见错误的产生。程序中类响应程序中类响应windowswindows消息的优先顺序:消息的优先顺序:取决于消息传递的顺序。取决于消息传递的顺序。对于标准对于标准WindowsWindows消息消息(窗口消息窗口消息),由产生这些消息的对,由产生这些消息的对象响应,如窗口的创建象响应,如窗口的创建WM_CREATE,WM_CREATE

38、,窗口的移动窗口的移动WM_MOVEWM_MOVE,由产生消息的窗口类响应。如果找不到相应的处理函,由产生消息的窗口类响应。如果找不到相应的处理函数,则将消息传递到其父类,一般情况都有缺省的响应数,则将消息传递到其父类,一般情况都有缺省的响应函数;函数;对于命令消息对于命令消息WM_COMMANDWM_COMMAND,可由拥有菜单资源的所有类来,可由拥有菜单资源的所有类来处理,传递的顺序是视图类、文档类、文档模板类、框处理,传递的顺序是视图类、文档类、文档模板类、框架类、应用程序类,即这些类处理命令消息的优先顺架类、应用程序类,即这些类处理命令消息的优先顺序。序。详见第详见第2章。章。例如,当

39、用户在视图窗口中按下鼠标左键时,例如,当用户在视图窗口中按下鼠标左键时,WindowsWindows发送发送WM_LBUTTONDOWNWM_LBUTTONDOWN消息到应用程序,假设视图类需要响应这些消息到应用程序,假设视图类需要响应这些消息,在类的头文件消息,在类的头文件(.h)(.h)中有中有函数函数声明和声明和消息映射表消息映射表的声的声明:明:Class CMyView:public CView afx_msg void OnLButtonDown(UINT nFlags,CPoint point);/函数原型声明函数原型声明DECLARE_MESSAGE_MAP()/消息映射表声明

40、消息映射表声明 返回返回afx_msg标识消息映射函数标识消息映射函数,所有由,所有由ClassWizard生成生成的消息处理函数原型说明前都的消息处理函数原型说明前都有这一标识。有这一标识。注注视图类的定义文件视图类的定义文件(.cpp)中必须有中必须有消息映射消息映射定义:定义:BEIGN_MESSAGE_MAP(CMyView,CView)/消息映射表定义消息映射表定义ON_WM_LBUTTONDOWN()/函数名为函数名为OnLButtonDown /其它消息映射入口其它消息映射入口END_MESSAGE_MAP()以及对应的消息响应函数定义:以及对应的消息响应函数定义:void CM

41、yView:OnLButtonDown(UINT nFlags,CPoint point)/处理消息的操作代码,程序中具体实现处理消息的操作代码,程序中具体实现 返回返回将将CMyView的基的基类类CView也包含进也包含进去,当在派生类中去,当在派生类中没找到处理函数时没找到处理函数时,允许在基类中继,允许在基类中继续查找。续查找。注注3.2.3.3.2.3.文档文档/视图结构视图结构 1.1.文档类文档类 在基于文档在基于文档/视图结构的应用程序中,视图结构的应用程序中,CDocumentCDocument的派生对象负责读入、保存和管理的派生对象负责读入、保存和管理应用程序的数据。每个文

42、档类可能与多个视图应用程序的数据。每个文档类可能与多个视图类关联,而每个视图包含一个指向与其相关的类关联,而每个视图包含一个指向与其相关的文档的指针。文档的指针。文档类允许向其中增加文档类允许向其中增加数据成员数据成员,应用程,应用程序的数据可以是任何类型的,或者是任何自定序的数据可以是任何类型的,或者是任何自定义的数据结构,如结构体,类或链表等。义的数据结构,如结构体,类或链表等。3.2.3.3.2.3.文档文档/视图结构视图结构 文档类的常用成员函数文档类的常用成员函数(带带的表示是可重定义的的表示是可重定义的虚函数虚函数)成员函数成员函数说明说明GetFirstViewPositionG

43、etFirstViewPosition返回第一个视图的位置值返回第一个视图的位置值GetNextViewGetNextView返回指向相关视图队列中下一个视图的指返回指向相关视图队列中下一个视图的指针针GetPathNameGetPathName取得文档的文件名和路径,若文档未命名取得文档的文件名和路径,若文档未命名则返回空串则返回空串GetTitleGetTitle取得文档的标题,若文档未命名则返回空取得文档的标题,若文档未命名则返回空串串IsModifiedIsModified若文档包含未保存数据,则返回非若文档包含未保存数据,则返回非0 0,否则,否则返回返回0 0SetModified

44、FlagSetModifiedFlag设置或清除文档的修改标志设置或清除文档的修改标志表表3.43.4成员函数成员函数说明说明UpdateAllViewsUpdateAllViews文档对应多个视图时,更新所有视图,它是通文档对应多个视图时,更新所有视图,它是通过调用每个视图类的过调用每个视图类的OnUpdateOnUpdate函数来更新所有函数来更新所有与本文档关联的视图与本文档关联的视图OnNewDocumentOnNewDocument当创建一个新文档时由应用程序框架调用。重当创建一个新文档时由应用程序框架调用。重定义这个函数实现在新文档创建之前初始化文定义这个函数实现在新文档创建之前初

45、始化文档对象,如为指针申请内存空间档对象,如为指针申请内存空间OnOpenDocumentOnOpenDocument当从磁盘读入文档时由应用程序框架调用。重当从磁盘读入文档时由应用程序框架调用。重定义这个函数实现在新文档读入之前初始化文定义这个函数实现在新文档读入之前初始化文档的其它非序列化数据成员档的其它非序列化数据成员DeleteContentsDeleteContents由应用程序框架调用,以删除文档内容。重定由应用程序框架调用,以删除文档内容。重定义这个函数在文档关闭之前释放文档所占用的义这个函数在文档关闭之前释放文档所占用的内存和资源内存和资源SerializeSerialize由

46、应用程序框架调用对文档进行序列化,重定由应用程序框架调用对文档进行序列化,重定义这个函数实现特定文档的序列化,以保存或义这个函数实现特定文档的序列化,以保存或读入文档数据读入文档数据2.2.视图类视图类 视图类对象代表了应用程序的窗口客户区,是文视图类对象代表了应用程序的窗口客户区,是文档信息的一个显示窗口档信息的一个显示窗口(视口视口),它同时也是用,它同时也是用户与程序之间信息交互的桥梁,用户对数据的户与程序之间信息交互的桥梁,用户对数据的编辑和修改需要通过键盘或鼠标进行,这些消编辑和修改需要通过键盘或鼠标进行,这些消息都由视图类接受后再反映到文档类。息都由视图类接受后再反映到文档类。视图

47、类的派生关系:视图类的派生关系:CWndCViewCCtrlViewCListViewCEditViewCRichEditViewCTreeViewCScrollViewCFormViewCDaoRecordViewCDaoRecordView图图3.5 CViewCView类提供了向视图或打印机进行输出的基本类提供了向视图或打印机进行输出的基本框架,决定了视图的基本特性,派生的视图类可以框架,决定了视图的基本特性,派生的视图类可以重载基类的函数,或增加新的函数以决定特定视图重载基类的函数,或增加新的函数以决定特定视图的特性。的特性。CViewCView的派生类可以多种方式显示文档类的信息,的

48、派生类可以多种方式显示文档类的信息,每个视图类根据显示的方式各自定义其显示代码。每个视图类根据显示的方式各自定义其显示代码。MFC提供了一系列这样的类,如提供了一系列这样的类,如CTreeView 树型视图树型视图CListView 列表型视图列表型视图CFormView 显示基于对话框模板的视图显示基于对话框模板的视图CScrollView 带滚动条的视图。带滚动条的视图。1)1)视图类实现特定视图的特性的虚函数视图类实现特定视图的特性的虚函数GetDocument返回指向相关联文档对象的指针返回指向相关联文档对象的指针OnDraw支持打印、打印预览和在屏幕上显示,支持打印、打印预览和在屏幕

49、上显示,由由OnPaint(重画重画),OnPrint(打印打印)调调用用OnInitialUpdate当视图第一次与文档关联时被调用,重当视图第一次与文档关联时被调用,重定义这个函数对重新读入或新创建文定义这个函数对重新读入或新创建文档的视图进行初始化档的视图进行初始化OnUpdate当文档内容发生变化,视图需要更新时当文档内容发生变化,视图需要更新时被调用,更新整个视图。重定义这个被调用,更新整个视图。重定义这个函数可以实现只更新无效区域函数可以实现只更新无效区域表表3.5通过通过GetDocumentGetDocument获得与视图关联的文档类指针,通过指针获得与视图关联的文档类指针,通

50、过指针pDocpDoc访问文档类的数据成员和函数成员,在视图(窗口)访问文档类的数据成员和函数成员,在视图(窗口)中显示文档对象,当用户通过视图改变文档数据时,可中显示文档对象,当用户通过视图改变文档数据时,可设置自动更新文档内容。设置自动更新文档内容。文档文档/视图结构已经把应用程序所需要的数据处理与显示视图结构已经把应用程序所需要的数据处理与显示(虚函数虚函数)的框架构造好,程序设计人员只需要将具体应的框架构造好,程序设计人员只需要将具体应用的数据添加到文档类,并根据数据类型在视图类的用的数据添加到文档类,并根据数据类型在视图类的虚虚函数函数OnDrawOnDraw()()中完成数据的显示

51、。中完成数据的显示。2)2)视图类的成员函数访问与其关联的文档类的方式视图类的成员函数访问与其关联的文档类的方式 3.3.文档模板类文档模板类 CDocTemplateCDocTemplate类将框架、视图、文档对象及应用类将框架、视图、文档对象及应用 程程序的资源捆绑在一起。应用程序每打开一个文件,序的资源捆绑在一起。应用程序每打开一个文件,至少创建一个文档对象、一个视图对象和一个框架至少创建一个文档对象、一个视图对象和一个框架窗口,而文档模板对象负责管理所有这些对象,并窗口,而文档模板对象负责管理所有这些对象,并将各种相关资源与之联系在一起。将各种相关资源与之联系在一起。在大多数情况下,程

52、序不需要对这个类进行修改。在大多数情况下,程序不需要对这个类进行修改。对于对于SDISDI应用,使用应用,使用CSingleDocTemplateCSingleDocTemplate文档模板。文档模板。对于对于MDIMDI应用,使用应用,使用CMultiDocTemplateCMultiDocTemplate文档模板。文档模板。MDIMDI允许允许有多个文档模板,将不同文档有多个文档模板,将不同文档-视图类联系在一起,实现不视图类联系在一起,实现不同文档视图显示关系。同文档视图显示关系。4.4.文档文档/视图结构应用程序创建过程视图结构应用程序创建过程1)使用使用AppWzard,根据实际需要

53、,选择创建合适,根据实际需要,选择创建合适的应用程序框架的应用程序框架(是否使用文档是否使用文档/视图结构,使用视图结构,使用SDI或或MDI等等)2)在文档类中添加程序所处理的数据,作为文档类在文档类中添加程序所处理的数据,作为文档类数据成员;数据成员;3)在视图类中取得文档数据,以合适的方式在窗口在视图类中取得文档数据,以合适的方式在窗口中显示出来中显示出来5.应用实例应用实例 例例3_13_1:创建一个包含文档创建一个包含文档/视图结构单文档视图结构单文档界面应用的实例,为文档类添加一个字符界面应用的实例,为文档类添加一个字符串数据,在视图窗口显示出来。串数据,在视图窗口显示出来。步骤如

54、下:步骤如下:(1).(1).在在FileFile菜单中选择菜单中选择NewNew,如图,如图3.3.,在,在ProjectProject页面选择页面选择MFC AppWizard(exeMFC AppWizard(exe),),在在Project nameProject name中输入中输入Ex3_1,Ex3_1,并选择合适的并选择合适的路径按路径按OKOK按钮。按钮。(2).(2).在在AppWizard Step 1AppWizard Step 1中,如图中,如图3.3.,选择选择Single DocumentSingle Document单单 选按钮,并选选按钮,并选中中Documen

55、t/View architechureDocument/View architechure SupportSupport复选框,复选框,表示使用文档表示使用文档/视图结视图结构,按构,按FinishFinish按钮。显示按钮。显示New Project New Project InformationInformation信息框,显示新创建的工程信息框,显示新创建的工程的有关信息按的有关信息按OKOK按钮,这样工程创建完按钮,这样工程创建完毕。毕。图图3.3.New ProjectNew Project对话框对话框图图3.3.AppWizard Step1AppWizard Step1 在在VC

56、VC集成开发环境中看到,新工程生成了五个类,集成开发环境中看到,新工程生成了五个类,如如图图3.3.在在class viewclass view页面上可看到这些类。页面上可看到这些类。CAboutDlgCAboutDlg 派生自派生自CDialogCDialog,一个,一个AboutAbout对话框。对话框。CEx3_1App CEx3_1App 派生自派生自CWinAppCWinApp,其全局对象,其全局对象theApptheApp 代表应用程序本身。代表应用程序本身。CEx3_1DocCEx3_1Doc 派生自派生自CDocumentCDocument,文档类。,文档类。CEx3_1Vie

57、wCEx3_1View 派生派生自自CViewCView,视图类。,视图类。CMainFrameCMainFrame 派生自派生自 CFrameWndCFrameWnd,程序框架类。,程序框架类。文档、视图及应用程序类名都以工程名开文档、视图及应用程序类名都以工程名开头,后接对应的类型名,这有助于在程头,后接对应的类型名,这有助于在程序中有多个文档视图类时区分主视图与序中有多个文档视图类时区分主视图与其它视图,区分主文档与其它文档类。其它视图,区分主文档与其它文档类。应用程序向导应用程序向导AppWizardAppWizard为每个类生成了一为每个类生成了一个头文件和一个个头文件和一个.cpp

58、.cpp文件,还自动生成文件,还自动生成了了stdafx.hstdafx.h和和stdafx.cppstdafx.cpp,图图3.3.,AppWizardAppWizard还生成了缺省的用户界面资源还生成了缺省的用户界面资源文件,在文件,在Resource viewResource view页面显示。页面显示。图图3.3.ClassViewClassView图图3.3.FileViewFileView(3).(3).为文档类增加数据成员。在编辑窗口打开文档为文档类增加数据成员。在编辑窗口打开文档类的头文件类的头文件Ex3_1Doc.hEx3_1Doc.h,手工添加手工添加一个字符数组一个字符数

59、组成员成员m_StrNamem_StrName;或或在在WorkspaceWorkspace的的ClassViewClassView页面,页面,右击右击 CEx3_1DocCEx3_1Doc类,在弹出式菜单中类,在弹出式菜单中选择选择Add Add Member VariablesMember Variables,在对话框中输入变量类型和,在对话框中输入变量类型和名称。名称。class CEx3_1Doc:public CDocument /Ex3_1Doc.h/Attributespublic:char m_StrName80;在文档类构造函数中对新增加的变量进行初始化。在文档类构造函数中对

60、新增加的变量进行初始化。CEx3_1Doc:CEx3_1Doc()/Ex3_1Doc.cpp /TODO:add one-time construction code here strcpy(m_StrName,A Simple Document/View Application.);(4).(4).显示字符串显示字符串.在在CEx3_1ViewCEx3_1View的的OnDrawOnDraw()()函数显示函数显示字符串。字符串。void CEx3_1View:OnDraw(CDC*pDC)CEx3_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TO

61、DO:add draw code for native data herepDC-TextOut(0,0,pDoc-m_StrName);/Ex3_1View.cpp图图3.10 3.10 例例3.13.1第一步主界面第一步主界面3.3.用户界面资源的应用用户界面资源的应用 资源是资源是windowswindows应用程序的一种特殊数据,包括菜单、加速键、应用程序的一种特殊数据,包括菜单、加速键、光标、位图、图标、对话框、字符串、工具栏、状态栏等,光标、位图、图标、对话框、字符串、工具栏、状态栏等,资源一般放在资源一般放在exeexe或或DLLDLL文件中。文件中。当当windowswindo

62、ws将程序装入内存时,一般不将资源同时装入,而是将程序装入内存时,一般不将资源同时装入,而是当需要某个资源时才将相应资源装入。当需要某个资源时才将相应资源装入。资源定义在资源脚本(资源定义在资源脚本(resource scirptresource scirpt)文件中。)文件中。以以.rc.rc为为文件扩展名,文件名与工程名相同。文件扩展名,文件名与工程名相同。资源脚本文件中定义了各种资源的相关数据,资源脚本文件中定义了各种资源的相关数据,WindowsWindows通过使通过使用不同的资源标识符前缀来区分不同资源类型用不同的资源标识符前缀来区分不同资源类型(如如表表3.3.所所示),这样做虽

63、然不是必须的,但遵循这样的规则示),这样做虽然不是必须的,但遵循这样的规则 有利有利于提高程序的通用性和可读性。于提高程序的通用性和可读性。表表3.3.资源类型及其标示资源类型及其标示 资源标识前缀资源标识前缀IDM_ID_IDI_IDB_IDD_IDR_IDC_IDS_资源类型资源类型菜单项菜单项IDID菜单命令菜单命令IDID图标图标IDID位图位图IDID对话框对话框IDID菜单栏、工具栏、加速键菜单栏、工具栏、加速键控件控件IDID字符串字符串返回返回Visual C+6.0中提供了资源编辑器,对资源中提供了资源编辑器,对资源进行可视化编辑,并自动生成进行可视化编辑,并自动生成资源脚本

64、文件资源脚本文件;脚本文件可用文本编辑器进行编辑,但其可脚本文件可用文本编辑器进行编辑,但其可读性较差,容易出错,一般情况下尽量不要读性较差,容易出错,一般情况下尽量不要进行编辑。进行编辑。用户定义的资源标识符号常量定义在用户定义的资源标识符号常量定义在resource.h文件中。文件中。本节为例题本节为例题3_1添加一些内容。添加一些内容。3.3.3.3.用户界面资源的应用用户界面资源的应用 3.3.1.3.3.1.菜单菜单 分类分类:顶层菜单顶层菜单 :一般位于应用程序主窗口或顶层窗口一般位于应用程序主窗口或顶层窗口 弹出式菜单弹出式菜单:选择某个菜单项后弹出的子菜单选择某个菜单项后弹出的

65、子菜单 1.菜单的编辑菜单的编辑 如果是如果是AppWizardAppWizard产生的程序,系统已为框架创产生的程序,系统已为框架创建了一个标准的主菜单,包括文件、编辑、视图、建了一个标准的主菜单,包括文件、编辑、视图、窗口帮助等标准菜单,定义了各菜单项的窗口帮助等标准菜单,定义了各菜单项的IDID及相及相应的命令处理函数。在应的命令处理函数。在Resource ViewResource View页面,打开页面,打开工程资源,选择工程资源,选择MenuMenu,然后双击主菜单资源,然后双击主菜单资源IDR_MAINFRAMEIDR_MAINFRAME标示,可打开菜单编辑器。标示,可打开菜单编

66、辑器。添加新的菜单资源添加新的菜单资源选择选择Insert ResourceInsert Resource菜单项,在菜单项,在Insert ResourceInsert Resource对话框对话框中,选择中,选择MenuMenu资源类型,单击资源类型,单击NewNew按钮,缺省新菜单名为按钮,缺省新菜单名为IDR_MENU1IDR_MENU1。a)增加一个顶层菜单增加一个顶层菜单 在菜单属性对话框中,选中在菜单属性对话框中,选中Pop-upPop-up选项,可以定义一选项,可以定义一个顶层菜单,在个顶层菜单,在CaptionCaption编辑框中输入菜单名,菜单名即显编辑框中输入菜单名,菜单名即显示在菜单上。若在菜单名的某个字符前加一个示在菜单上。若在菜单名的某个字符前加一个&符号,则菜符号,则菜单名该字符下显示一个下画线,可用单名该字符下显示一个下画线,可用AltAlt加该字符作为选择加该字符作为选择菜单的快捷方式。菜单的快捷方式。对中文菜单对中文菜单“文件文件”,如希望用,如希望用Alt-FAlt-F作作为键盘操作方式,可写成为键盘操作方式,可写成“文件文件(&F)”(&F)”。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!