400 likes | 615 Views
第 10 章 MFC 编程基础. 王建兴 闽江学院物理学与电子信息工程系. 10.1 MFC 概述. 微软基础类库( MFC )是微软为 Windows 程序员提供的一个面向对象的 Windows 编程框架。 所谓的框架是指为某一特定目的实现一个基本的、可执行的架构。框架中已经包含了应用程序从启动到运行的主要流程,流程中那些无法预先确定的步骤留给用户来实现。程序运行时,框架系统自动调用用户实现的功能组件。. 10.2 MFC 类的组织结构及主要的类的简介. MFC 类库可分为两个主要部分:( 1 )基础类( 2 )宏和全程函数。 基础类包括: P218 宏和全局函数
E N D
第10章 MFC编程基础 王建兴 闽江学院物理学与电子信息工程系
10.1 MFC概述 • 微软基础类库(MFC)是微软为Windows程序员提供的一个面向对象的Windows编程框架。 • 所谓的框架是指为某一特定目的实现一个基本的、可执行的架构。框架中已经包含了应用程序从启动到运行的主要流程,流程中那些无法预先确定的步骤留给用户来实现。程序运行时,框架系统自动调用用户实现的功能组件。
10.2 MFC类的组织结构及主要的类的简介 • MFC类库可分为两个主要部分:(1)基础类(2)宏和全程函数。 • 基础类包括:P218 • 宏和全局函数 约定:以“Afx”为前缀除了数据库类函数和DDX(Dialog Data Exchange)函数外为全局函数。所有全程变量都是以“afx”为前缀,宏不带任何特别前缀,但是全部大写。 见表10-1
10.2.2 MFC中基本类简介 • 根类(CObject ) 绝大多数的MFC类是从CObject继承下来;它提供了下述服务:对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。 1、运行时类型检查: CMyFrame *pFrame=(CMyFrame*)AfxGetMainWnd(); ASSERT(pFrame->IsKindOf(GetRuntimeClass(CMyFrame))); 2、串行化:通过类CArchive相结合,提供将多个不同对象以二进制形式保存到磁盘文件(Serilization)中以及根据磁盘文件中的对象状态数据在内存中重建对象(Deserilization )的功能。CObject类定义了两个在串行化操作函数:Serialize和IsSerializable。
10.2.2 MFC中基本类简介 • 根类(CObject ) 绝大多数的MFC类是从CObject继承下来;它提供了下述服务:对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。 1、运行时类型检查: CMyFrame *pFrame=(CMyFrame*)AfxGetMainWnd(); ASSERT(pFrame->IsKindOf(GetRuntimeClass(CMyFrame))); 2、串行化:通过类CArchive相结合,提供将多个不同对象以二进制形式保存到磁盘文件(Serilization)中以及根据磁盘文件中的对象状态数据在内存中重建对象(Deserilization )的功能。CObject类定义了两个在串行化操作函数:Serialize和IsSerializable。
10.2.2 MFC中基本类简介 • 应用程序体系结构类 应用程序体系结构类主要包括与命令相关的类:窗口应用程序类、文档/视图类和线程基类等。 1)命令相关类:CCmdTarget类 它是MFC库中所有具有消息映射属性的类的基类。 它派生出:如窗口类(CWnd)、应用程序类(CWinApp)、文档模板类(CDocTemplate)、文档类(CDocument)、视图类(CView)及框架窗口类(CFrameWnd)等。 2)窗口应用程序类:CWinApp类 每个应用程序只有一个应用程序对象。应用程序对象的类是从CWinApp类派生出来的。
10.2.2 MFC中基本类简介 • 应用程序体系结构类 3)文档/视图类 文档对象由文档模板对象创建,用于管理应用程序的数据。视图对象表示一个窗口的客户区,显示文档数据并允许用户与之交互。 这些模板及基类有: lCDocTemplate:文档模板基类。文档模板负责协调文档、视图和框絮窗口的创建。 lCSingleDocTemplate:单文档应用程序(SDI)的文档模板。 lCMultiDocTemplate:多文档应用程序(MDI)的文档模板。 lCDocument:应用程序专用文档的基类。 CView:显示文档数据的应用程序专有视图的基类
10.2.2 MFC中基本类简介 • 3、可视对象类 1)窗口类:CWnd类 该类为MFC中所有窗口类提供基本功能。创建Windows窗口要分两步进行:首先引入构造函数,构造一个CWnd对象,然后调用Create()函数创建Windows窗口。MFC还从CWnd类派生出各种风格的窗口类型以完成更具体的窗口创建工作,包括: lCFrameWnd:框架窗口类,SDI应用程序主框架窗口的基类。 lCMDIFrameWnd:多文档框架窗口类,MDI应用程序主框架窗口的基类。 lCMDIChildWnd:多文档框架窗口类,MDI应用程序文档框架窗口的基类。
10.2.2 MFC中基本类简介 • 3、可视对象类 2)视图类:CView类 该类的实例表示框架窗口类的显示文档数据并接收输入的客户区,其派生类主要有如下几种: lCScrollView:具有滚动功能的视图类的基类。 lCFormView:其布局在对话资源中定义的滚动视图类。 lCEditView:显示一个编辑控件,提供多行文本的编辑,具有文本编辑、查找、替换和滚动功能的视图类。 lCRichEditView:显示一个直通文本编辑控件的视图类。 lCListVew:显示一个列表控件的视图类。 lCTreeVew:显示一个树控件的视图类。 lCRecordView:支持对话框数据交换的视图类。 lCCtrlView:支持直接基于控件的视图,是CEditView, CRichView, CTreeVew, CListView的基类。
10.2.2 MFC中基本类简介 • 3、可视对象类 3)菜单类:Menu类 4)对话框类:CDialog类 lCFileDialog:提供打开或保存一个文件的标准对话框。 lCColorDialog:提供选择一种颜色的标准对话框。 lCFontDialog:提供选择一种字体的标准对话框。 lCPrintDialog:提供打印一个文件的标准对话框。 lCFindReplaceDialog:提供一次查找并替换操作的标准对话框。 5)控件类 控件子层次结构包括若干类,使用这些类可建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。 主要控件类 P221-222
10.2.2 MFC中基本类简介 • 3、可视对象类 6)控制条类:CConlrolBar类 控制条的主要表现形式是工具栏、状态条、对话条。派生类有: CStatusBar:状态条控件类的基类。 lCToolBar:包含位图命令按钮的工具栏控件类。 lCDialogBar:对话条类(控制条形式的非模态对话框)。 7)绘画对象类:CGdiObject类 图形绘画对象的类层次结构以CGdiObject类为基类,可用于建立绘画对象模型,如画笔、刷子、字体、位图、调色板等。派生类有: CBitmap:该类封装一个GDI位图,提供一个操作位图的接口。 lCBrush:该类封装一个GDI画刷,可被选择为设备描述表的当前画刷。 lCFont:该类封装一种GDI字体,可被选择为设备描述表的当前字体。 lCPalette:该类封装一个GDI调色板,用作应用程序和彩色输出设备(如显示器)之间的接口。 lCPeb:该类封装一种GDI画笔,可被选择为设备描述表的当前画笔。 lCRgn:该类封装一个GDI域,用于操作窗口内的椭圆区域或多边形区域。该类与CDC类的裁剪成员函数一起使用。
10.2.2 MFC中基本类简介 • 3、可视对象类 8)设备描述表类:CDC类 该类及其派生类支持设备描述表对象。CDC类是一个较大的类,包括许多成员函数,如映像函数、绘画工具函数、区域函数等,通过这些成员函数可以完成所有的绘画工作。CDC类具有如下的子类: lCPaintDC:显示描述表类。用于窗口类的OnPaint成员函数和视图类的OnDraw成员函数中,自动调用BeginPaint进行构造,调用EndPaint进行析构。 lCClientDC:窗口客户的显示描述表类。例如,用于在快速响应.鼠标事件时进行绘画。 lCWindowDC:整个窗口的显示描述表类,包括客户区和框架区。 lCMetaFileDC:Windows元文件的设备描述表类。Windows元文件包含一个图形设备接口(GDD命令序列,该序列可被重新执行而创建一幅图像。对CMetaFileDC的成员函数的调用记录在一个元文件中。
10.2.2 MFC中基本类简介 • 4、通用类 (略讲) • 5、OLE类 (略) • 6、ODBC数据库类(略)
10.3 快速设计Windows应用程序 • 使用MFC构建Windows应用程序方法是:首先利用Visual Studio的可视化编程工具AppWizard生成框架程序,然后再根据具体的需要里边填写代码。 • 10.3.1 创建MFC应用程序框架 【示例10_1】演示并解释相关选项
10.3.2MFC应用程序的文件框架 • 在指定的Exam3_1目录下创建了许多文件,这些文件包含了框架程序的所有类、全局变量的声明和定义。 • 1.工作区文件、项目文件 (1) Exam3_l.dsw:工作区文件。 (2) Exam3_1.dsp:MFC生成的项目文件,或叫工程文件。 (3) Exam3-1.clw:类信息文件。 • 2.应用程序源文件和头文件 包括:应用程序类、文档类、主窗口类和视图类的声明文件和实现文件。 (1) Exam3_l.h:应用程序的主头文件 (2)Exam3_l.cpp:应用程序的主源文件。 (3)MainFrm.cpp, MainFrm.h这两个文件。 (4)Exam3_1Doc.cpp,Exam3_1Doc.h从CDocument类派生,并实现CExam3_1Doc文档类 (5)Exam3_1View.cpp, Exam1_1View.h派生并实现名为CExam3_1View的视图类。
10.3.2MFC应用程序的文件框架 • 3.资源文件 • AppWizard创建的与资源相关的文件有Exam3_1RC, RESOURCER, Exam3_l.rc2。资源文件包括以下各类文件。 (1)一般MFC应用程序的默认菜单定义、加速键表和字符串表。 (2)程序默认的About对话框和一个图标文件(RES\Exam3_1.ICO )。 (3)标准的MFC类的资源。如果指定了支持工具栏,它还将指定工具栏位图文件(RES\TOOLBAR.BMP)。 Exam3_l.rc2用于存放Visual Studio不可直接编辑的资源
10.3.2MFC应用程序的文件框架 • 4.预编译头文件 StdAfx.cpp, StdAfx.h用于建立一个预编译的头文件Exam3_1.PCH和一个预定义的类型文件StdAfx.obj。
窗口框架对象 ② 应用程序对象 ① ③ 文档对象 视图对象 10.3.3 MFC应用程序的运行机制 • 1.文档/视图结构 • 文档/视图结构是MFC应用程序最核心的概念 • 文档对象通常代表一个已经打开的文件,而视图对象表示文档中数据的可视化表示,并提供可视化交互界面允许用户查看、编辑数据。 ①传递消息到窗口框架 ②传递消息到视图 ③消息在视图与文档对象 间双向传递
CObject CCmdTarget CWidThread CWnd CDocumentObject CWinApp CFrameWnd CExam10_1Doc CExam10_1App CMainFrame CView CExam3_1View 图3-11 MFC应用程序中类的继承关系 10.3.3 MFC应用程序的运行机制 2.类的继承关系
10.3.3 MFC应用程序的运行机制 • 2.类的继承关系 • 1)应用程序类CExam10_1App • 在类实现文件中包含: • ①应用程序类的消息映射。 • ②一个空的应用程序类的构造函数。 • ③一个CExam3_1App类的全局对象theApp。 • ④一个InitInstance函数的标准定义。 • CWinApp提供了4个函数管理实现MFC应用程序的生命期,其中只有InitInstance()函数是必须被重载的。 • 注意分析:Initlnstance()函数 2.类的继承关系 1)应用程序类CExam10_1App 在类实现文件中包含: ①应用程序类的消息映射。 ②一个空的应用程序类的构造函数。 ③一个CExam3_1App类的全局对象theApp。 ④一个InitInstance函数的标准定义。 CWinApp提供了4个函数管理实现MFC应用程序的生命期,其中只有InitInstance()函数是必须被重载的。 注意分析:Initlnstance()函数
10.3.3 MFC应用程序的运行机制 2)主框架类CMainFrame 单文档程序的主框架窗口是在调用ProcessShellCommand()函数时创建的 CMainFrame::OnCreate()函数就是WM_CREATE消息的处理函数,这个函数首先调用了基类CFramewnd的处理函数,让基类完成初始化工作,然后为主框架窗口创建工具栏和状态栏。 两个成员变量m wndToolBar和m wndStatusBar分别对应着程序主窗口中的工具栏和状态栏。 CToolBar::LoadToolBar()函数负责装载工具栏资源,而CToolBar::CreateEx()函数负责工具栏的创建。 CStatusBar::Create()函数负责状态栏的创建,CStatusBar::SetIndicators()函数负责设置状态栏上的窗格。
10.3.3 MFC应用程序的运行机制 3)文档类 AppWizard默认重载两个虚函数OnNewDocument()和Serialize()函数。 Serialize()成员函数完成串行化操作,既将文件中的数据装入到文档对象或将文档对象的数据保存到文件中。
10.3.3 MFC应用程序的运行机制 4)视图类 CView类的主要成员函数及功能如下: ①GetDocument():返回一个指向相关文档对象的指针,通过该指针,可以在视图类的成员函数中操作文档对象中的数据,实现输出。 ②OnDraw():支持打印、打印预览和屏幕输出。 ③OnInitialUpdate():当一个视图第一次与文档对象相关联时,由系统自动调用 ④OnUpdate():当文档对象的数据更新后,需要更新视图时调用。默认时对整个视图进行更新,可编写代码重载该函数,仅更新部分视图。
程序开始 CWinApp类的构造函数 窗口框架对象 ② 创建全局对象theApp CExam3_1类的构造函数 整个程序的初始化 AfxWinMain函数 pApp->InitApplication() 程序实例的初始化: 创建主窗口对象、视图对象、文档对象;分析和处理命令行参数;显示并更新主框架窗口和视图窗口 pThread->InitInstance() pThread->Run() CwinThread->Run() 消息循环 结 束 10.3.3 MFC应用程序的运行机制 3.MFC应用程序的控制流程
10.3.3 MFC应用程序的运行机制 • 采用MFC类库开发的所有Windows程序至少有一个从CWinApp派生的应用程序类和一个从CWnd派生的窗口类。 • _tWinMain()函数理化是整个程序的入口,它所调用的AfxWinMain函数完成具体的任务。 • 在CWinApp中有3个重要的虚拟成员函数:InitApplication()、InitInstance()和Run()。应用程序必须重载CWinApp类中的InitInstance()函数,因为CWinApp并不知道应用程序需要什么样的窗口
10.3.3 MFC应用程序的运行机制 • 1)创建全局对象 • 2)AfxWinMain函数 • 3)CExam3_1App::InitInstance()分析 • 4)CWinApp::Run成员函数
3.4消息映射--3.4.1消息的类别及其描述 • 在MFC应用程序中,消息分为窗口消息、命令消息和控件消息三种类型。 • 1.窗口消息 • 系统可以产生窗口消息,与窗口交互也能产生窗口消息。窗口消息只能被窗口或者窗口对象处理。在MFC应用程序中,CView和CFrame及其派生类、自定义窗口类能够处理窗口消息。 • 窗口消息的字段格式为: (1)message WM_XXX (2)wParam和lParam随WM XXX而变 要关闭一个窗口,只需要发给它消息包(WM_CLOSE,0L,0L)即可。
3.4.1消息的类别及其描述 • 2.命令消息 • 选择菜单项、单击工具按钮、按加速键及程序中的命令等都可以产生命令消息。在MFC应用程序中,凡是从基类CCmdTarget派生的类都能处理命令消息。 • 命令消息的字段格式如下: (1)message WM_COMMAND (2)wParam 低16位为命令ID,高16位为0 (3)1Param 0L
3.4.1消息的类别及其描述 • 3.控件消息 • 当控件事件发生时,如改变文本框控件的内容、选择列表框控件中的某一选项等,都会产生控件消息。 • 控件消息的字段格式如下: (1)message CONTROL CONTROL表示一个包含通知码前缀的名称,其实质仍然是向包含的窗口发送WM_COMMAND消息。 (2)wParam 底16位为控件ID,高16位为控件通知码 (3)1Param 控件窗口句柄
3.4.1消息的类别及其描述 • 常用控件的控件通知码前缀: ·BN——表示按钮控件消息。 ·CB——表示组合框控件消息。 ·DM——表示默认下压式按钮控件消息。 ·EN——表示编辑控件消息。 ·LB——表示列表框控件消息。 ·SBM——表示滚动条控件消息。
3.4.2消息处理机制 • 消息处理机制包含 : • 声明消息的映射 在类的定义文件(*.h文件)中添加消息处理函数的声明,一般形式为: Afx_msg void ClassMethod(); 一个DECLARE_MESSAGE_MAP()宏,主要工作是到消息映射表中收集和处理消息的消息映射项。
3.4.2消息处理机制 • 消息处理机制包含 : 2.定义消息的映射 在类的实现文件(.cpp文件)中,向消息映射表中加入与定义文件中消息处理函数声明相对应的映射宏。 BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) ON_WM_CREATE() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_WM_CLOSE() END_MESSAGE_MAP()
3.4.2消息处理机制 • 消息映射表中加入消息映射项的宏也可以分为4类,分别是:窗口消息映射项、命令消息映射项、控件通知消息映射项和用户交互对象更新消息映射项。 • 1)窗口消息映射项:ON_WM_XXX() 除WM_COMMAND消息之外,例如WM_PAINT、WM_MOUSEMOVE等消息
3.4.2消息处理机制 • 2)命令消息映射项 ON_COMMAND(ID,ClassMethod) • 3)控件通知消息映射项 通用控件消息映射项的格式: ON_CONTROL(wNotifyCode,ID,ClassMethod)
3.4.2消息处理机制 • 3)控件通知消息映射项 常用控件的控件通知消息映射项: ON_BN_EVENT(ID,ClassMethod) //BN为按钮控件通知码 ON_CBN_EVENT(ID,C1assMethod) //CBN为组合框控件通知码 ON_EN_EVENT(ID,C1assMethod) //EN为编辑控件通知码 ON_LBN_EVENT(ID,C1assMethod) //LBN为列表框控件通知码
3.4.2消息处理机制 • 4)用户交互对象更新消息映射项 ON_UPDATE_COMMAND_UI(ID,ClassMethod)
3.4.2消息处理机制 • 添加自定义消息 (1)定义自己的消息名 define WM_MYMESSAGE (WM_USER+1) (2)添加消息映射 BEGIN_MESSAGE_MAP(CMyWnd,CMyParentWndClass) ON_MESSAGE (WM_MYMESSAGE,OnMyMessage) END_MESSAGE_MAP()
3.4.2消息处理机制 • 添加自定义消息 (3)在类的.h文件中加入消息处理函数的原型声明如下: afx_msg LRESULT OnMyMessage(WPARAM,LPARAM); (4)在类的.cpp文件中编辑对应消息的处理函数
3.4.3消息的发送 • Windows提供了三个API函数用于发送消息,这三个函数是:SendMessage、PostMessage和SendDlgItemMessage。
3.4.4消息的传递 • 命令消息只要是从基类CCmdTarget派生的类都能处理,而窗口消息只能被窗口类或视图类处理。 • 单文档应用程序中对象处理命令的优先级: 视图一>文档一>主框架一>应用程序 • 多文档应用程序中对象处理命令的优先级: 视图一>文档一>子框架一>主框架一>应用程序