您好,欢迎访问三七文档
第三章MFC程序设计本章的内容,简洁而不失完整性:由应用程序向导建立程序框架,由资源编辑器建立用户界面,由类向导建立成员变量、消息映射和处理函数,加上文档序列化和注册MFC包含了所有与系统相关的类(包括图形用户界面相关的类),其中封装了大多数的API函数,提供了应用程序框架和开发应用程序的工具如应用程序向导、类向导、可视化资源设计等高效工具,用消息映射处理消息响应,大大简化了Windows应用程序的开发工作,使程序员可以从繁重的编程工作中解脱,提高工作效率。3.1.MFC程序设计简介3.2.MFC程序设计3.3.用户界面资源的应用3.4.对话框的应用3.5.基于对话框的应用程序设计实例3.6.文本和图形输出3.7.文档的保存3.8.MDI应用程序设计目录3.1MFC程序设计简介MFC类库基础类(已在第二章中介绍)宏、全局变量及全局函数应用程序框架3.1.1MFC定义的宏、全局函数及全局变量类库1.MFC提供的主要宏:消息映射宏:声明消息映射表宏DECLARE_MESSAGE_MAP、消息映射定义宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP消息映射表入口宏ON_消息名。(本章只介绍消息映射宏)3.1.1MFC定义的宏、全局函数及全局变量动态MFC对象宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC动态创建对象宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE运行时类宏:RUNTIME_CLASS序列化宏:DECLARE_SERIAL和IMPLEMENT_SERIAL诊断服务宏:ASSERT、VERIFY跟踪服务宏:TRACE异常处理宏:THROW3.1.1MFC定义的宏、全局函数及全局变量MFC提供一些不属于任何类的全局函数,函数名以Afx开头,可以被应用程序中的所有类和函数所调用。如:AfxAbort(),无条件终止一个应用程序的执行;AfxGetAppName(),返回指向应用程序名的字符串指针;AfxWinInit(),由WinMain()调用,对MFC应用程序进行图形用户界面(GUI)的初始化等等。3.全局变量全局变量名以afx开头,如afxTraceFlag、afxDump等,主要与异常处理有关。2.全局函数3.1.2MFC命名规则匈牙利命名法规定:•变量名以一个或多个小写字母开头作为前缀,标识变量的数据类型;•类型标识后是若干个单词,标识变量含义,每个单词以大写字母开头,其余字母小写;•MFC中所有类及自定义类都以C开头;•类成员变量以m_为前缀,下划线后是变量名等等。前缀数据类型例B,bBOOLbIsValidChcharChText,ChGradecclasscStringCsCStringCsNameDwDWORDDwFlagsfnfunctionfnSorthandlehWnd,hPeniintiCountppointerpFrameszASCIIstringszNamem_Datamemberm_szName表3.1命名规则hMFC提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列起动文件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员在程序中补充完善,开发人员只需要完成针对特定应用的代码。使用应用程序框架的应用程序代码小,运行速度快,它提供的工具也降低了编码的难度。3.1.3应用程序框架介绍程序的数据储存在文档类中(作为文档类的数据成员),是对数据的抽象表示。数据显示由视图负责,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在窗口,用户通过视图与程序交互。一个文档可以对应多个不同视图;而一个视图一般只对应一个文档。当文档数据发生变化时,视图显示的状态也会随之变化;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。1.文档-视图结构文档视图结构提供一种连续处理数据的方式,使应用程序的数据与数据的显示分开处理。文档、视图及框架的关系:框架窗口对象文档与视图之间的双向数据交换发送至视图对象的消息文档对象(保存程序数据)应用程序对象视图对象发送至框架窗口的消息图3.12.单文档界面应用单文档界面应用程序简称SDI(SingleDocumentInterface),只允许一个框架窗口存在,每次只能创建和拥有一个文档对象,也只允许打开一个文档。SDI各类关系图可将文档比作一个文件袋,专门用于保存文件数据,需要看时需从文件袋(文档)中取出来,放到桌面(视图)上看。表3.2基于文档/视图关系的SDI应用中的类Document文档类储存与应用程序相关的数据View视图类决定文档数据的显示方式,提供用户界面Framewindow框架窗口派生自CFrameWnd,为CWinApp类的m_pMainWnd成员赋值Documenttemplate文档模板CSingelDocTemplate类对象,用构造函数将文档、视图、框架窗口及用户界面资源联系在一起,创建并管理文档Application应用程序类代表应用程序,拥有指向文档管理类的指针,管理应用程序中所有文档模板,负责初始化和退出清理工作返回应用程序类框架类(窗口框架)资源(决定用户界面的显示)视图类(显示数据并与用户交互)文档类(保存数据)单文档模板返回应用程序类CDocManager*m_pDocManager框架类(窗口框架)资源(决定用户界面的显示)m_pDocument视图类(显示数据并与用户交互)文档类(保存数据)m_pDocTemplatem_viewList返回单文档模板CRuntimeClass*m_pDocClassCRuntimeClass*m_pFrameClassCRuntimeClass*m_pViewClassUINTm_nIDResource多文档界面应用简称MDI(MultipleDocumentInterface),允许有多个文档类、视图类和多个文档模板CMultiDocTemplate(建立多种文档-视图-子框架关系)存在,运行时允许打开多个MDI子框架窗口,拥有各自的文档和视图对象。示例关系图在打开的多个子窗口中,只有一个活动窗口,应用程序菜单和工具栏的所有的命令都是针对活动窗口的。3.多文档界面应用子框架资源2视图类2文档类2文档模板2子框架资源1视图类1文档类1文档模板1主框架…其它文档模板返回CDocManager应用程序类CDocManager*m_pDocManager文档/视图结构可以充分发挥应用程序框架和MFC的优势,是MFC应用程序的核心,但使用它也要付出运行效率和代码增大的代价。文档/视图结构对应用程序来说并不是必不可少的,有两种常见的非文档/视图结构应用。4.非文档/视图结构应用常见非文档/视图结构应用:(1).基于对话框的应用,它包含一个CWinApp对象和一个模态对话框,对话框负责数据的存储和显示。关系图(2).SDI或MDI应用,都可以不包含文档对象,SDI包含一个CWinApp对象,一个框架窗口对象和一个从CWnd派生的CChildView视图对象,视图对象负责数据的显示,MDI应用还包括一个子框架窗口。对话框类作为应用程序主窗口负责保存和显示数据应用程序类返回Dialog-basedApplication主框架,应用程序主窗口CChildView视图类负责保存和显示数据应用程序类SDIApplication,NoneDoc/View返回子框架,视图框架窗口CChildView视图类应用程序类子框架,视图框架窗口CChildView视图类…主框架,应用程序主框架窗口MDIApplication,NoneDoc/View返回图3.2MFC应用程序开发过程类向导集成开发环境应用程序向导资源编辑器Create.def.cpp.h.dsw.dsp.ico.rc.bmp源文件资源文件编译.objBuild资源编译.res应用程序5.MFC应用程序创建6.最简单的MFC应用程序示例对于一个MFC应用程序来说,只有CWinApp的派生对象是必不可少的,其它类均可视情况进行取舍。下例是一个最简单的MFC应用程序。例:显示一个消息框。(1).创建工程,工程类型选择Win32Application,工程名为Ex3_0;(2).创建C++源文件,文件名Ex3_0.cpp,内容如下:#includeafxwin.hclassCEx3_0App:publicCWinApp{//CWinApp派生类public:virtualBOOLInitInstance(){MessageBox(NULL,”SimplistMFCApplication.”,”Ex3_0”,MB_OK);returnTRUE;}};CEx3_0ApptheApp;//全局变量,代表应用程序本身CWinApp::InitInstance()虚函数完成应用程序的初始化工作,派生的应用程序类都要重载此函数进行初始化,如完成主框架窗口的构造,窗口定义显示等工作。(3).设置使用MFC。选择Project|Settings…菜单项,选择General页面,在MicrosoftFoundationClasses组合框中选择UseMFCinasharedDLL。(4).编译生成并运行此工程,结果显示一个消息框,如下图:图3.3最简单MFC应用示例3.2.MFC程序设计MFC应用程序的执行过程(参见图3.4):1.构造全局对象—CWinApp派生类对象;2.运行由应用程序框架提供的WinMain函数;intAFXAPIAfxWinMain(...){CWinApp*pApp=AfxGetApp();AfxWinInit(...);pApp-IninApplication();pApp-InintInstance();nReturnCode=pApp-Run();AfxWinTerm();}CMyWinApptheApp;BOOLCMyWinApp::InitInstance(){m_pMainWnd=newCMyFrameWnd();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWndUpdateWindow();returnTRUE;}CMyFrameWnd::CMyFrameWnd(){Create(NULL,…,…,…)}CWinApp::Run();CWinThread::Run(){…do{::GetMessage(&msg,…);PreTranslateMessage(&msg);::TranslateMessage(&msg);::DispatchMessge(&msg);…}while(::PeakMessage());…}DefWindowProc()AfxWndProc()图3.4MFC应用程序的执行过程3.在WinMain中,通过afxGetApp()获得全局对象的指针pApp,调用全局函数AfxWinInit(),为CWinApp的成员变量m_hInstance,m_hPrevInstance,m_lpCmdLine,m_nCmdShow赋初值;然后调用pApp-InitApplication(),这是CWinApp的虚函数,一般不需要改写;调用pApp-InitInstance(),每个程序都必需改写这个函数,进行应用程序初始化;4.在InitInstance()函数中,先用new构造一个CFrameWnd派生类对象,其构造函数又调用Create(),创建主窗口,MFC依此自动为应用程序注册窗口类;调用ShowWindow()显示窗口,调用UpdateWindow(),发出WM_PAINT消息;5.回到WinMain中,调用pApp-Run,进入消息循环,通过API函数GetMessage()获得消息,TranslateMessage()处理消息,DispatchMessage()派送消息到CWnd::DefWindowProc(),DefWindowPr
本文标题:MFC程序设计
链接地址:https://www.777doc.com/doc-3970414 .html