《MFC程序设计ppt课件》由会员分享,可在线阅读,更多相关《MFC程序设计ppt课件(153页珍藏版)》请在金锄头文库上搜索。
1、第三章MFC程序设计 本章的内容 简洁而不失完整性 由应用程序向导建立程序框架 由资源编辑器建立用户界面 由类向导建立成员变量 消息映射和处理函数 加上文档序列化和注册MFC包含了所有与系统相关的类 包括图形用户界面相关的类 其中封装了大多数的API函数 提供了应用程序框架和开发应用程序的工具如应用程序向导 类向导 可视化资源设计等高效工具 用消息映射处理消息响应 大大简化了Windows应用程序的开发工作 使程序员可以从繁重的编程工作中解脱 提高工作效率 3 1 MFC程序设计简介3 2 MFC程序设计3 3 用户界面资源的应用3 4 对话框的应用3 5 基于对话框的应用程序设计实例3 6
2、文本和图形输出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 D
3、YNCREATE和IMPLEMENT DYNCREATE运行时类宏 RUNTIME CLASS序列化宏 DECLARE SERIAL和IMPLEMENT SERIAL诊断服务宏 ASSERT VERIFY跟踪服务宏 TRACE异常处理宏 THROW 3 1 1MFC定义的宏 全局函数及全局变量 MFC提供一些不属于任何类的全局函数 函数名以Afx开头 可以被应用程序中的所有类和函数所调用 如 AfxAbort 无条件终止一个应用程序的执行 AfxGetAppName 返回指向应用程序名的字符串指针 AfxWinInit 由WinMain 调用 对MFC应用程序进行图形用户界面 GUI 的初始化
4、等等 3 全局变量 全局变量名以afx开头 如afxTraceFlag afxDump等 主要与异常处理有关 2 全局函数 3 1 2MFC命名规则 匈牙利命名法规定 变量名以一个或多个小写字母开头作为前缀 标识变量的数据类型 类型标识后是若干个单词 标识变量含义 每个单词以大写字母开头 其余字母小写 MFC中所有类及自定义类都以C开头 类成员变量以m 为前缀 下划线后是变量名等等 表3 1命名规则 h MFC提供了构造Windows应用程序的框架 它不仅为应用程序建立标准的结构 生成一系列起动文件 还提供标准的图形用户界面如菜单 工具栏 状态条等供开发人员在程序中补充完善 开发人员只需要完成
5、针对特定应用的代码 使用应用程序框架的应用程序代码小 运行速度快 它提供的工具也降低了编码的难度 3 1 3应用程序框架介绍 程序的数据储存在文档类中 作为文档类的数据成员 是对数据的抽象表示 数据显示由视图负责 视图是程序窗口的客户区 框架窗口是客户区的框架 程序数据显示在窗口 用户通过视图与程序交互 一个文档可以对应多个不同视图 而一个视图一般只对应一个文档 当文档数据发生变化时 视图显示的状态也会随之变化 对于多个视图的情况 基于同一文档的多个视图的显示同步变化 1 文档 视图结构 文档视图结构提供一种连续处理数据的方式 使应用程序的数据与数据的显示分开处理 文档 视图及框架的关系 图3
6、 1 2 单文档界面应用 单文档界面应用程序简称SDI SingleDocumentInterface 只允许一个框架窗口存在 每次只能创建和拥有一个文档对象 也只允许打开一个文档 SDI各类关系图 可将文档比作一个文件袋 专门用于保存文件数据 需要看时需从文件袋 文档 中取出来 放到桌面 视图 上看 表3 2基于文档 视图关系的SDI应用中的类 返回 应用程序类 框架类 窗口框架 资源 决定用户界面的显示 视图类 显示数据并与用户交互 文档类 保存数据 单文档模板 返回 应用程序类CDocManager m pDocManager 框架类 窗口框架 资源 决定用户界面的显示 m pDocum
7、ent视图类 显示数据并与用户交互 文档类 保存数据 m pDocTemplatem viewList 返回 单文档模板CRuntimeClass m pDocClassCRuntimeClass m pFrameClassCRuntimeClass m pViewClassUINTm nIDResource 多文档界面应用简称MDI MultipleDocumentInterface 允许有多个文档类 视图类和多个文档模板CMultiDocTemplate 建立多种文档 视图 子框架关系 存在 运行时允许打开多个MDI子框架窗口 拥有各自的文档和视图对象 示例关系图 在打开的多个子窗口中 只
8、有一个活动窗口 应用程序菜单和工具栏的所有的命令都是针对活动窗口的 3 多文档界面应用 主框架 其它文档模板 返回 CDocManager 应用程序类CDocManager m pDocManager 文档 视图结构可以充分发挥应用程序框架和MFC的优势 是MFC应用程序的核心 但使用它也要付出运行效率和代码增大的代价 文档 视图结构对应用程序来说并不是必不可少的 有两种常见的非文档 视图结构应用 4 非文档 视图结构应用 常见非文档 视图结构应用 1 基于对话框的应用 它包含一个CWinApp对象和一个模态对话框 对话框负责数据的存储和显示 关系图 2 SDI或MDI应用 都可以不包含文档对
9、象 SDI包含一个CWinApp对象 一个框架窗口对象和一个从CWnd派生的CChildView视图对象 视图对象负责数据的显示 MDI应用还包括一个子框架窗口 对话框类作为应用程序主窗口负责保存和显示数据 应用程序类 返回 Dialog basedApplication 主框架 应用程序主窗口 CChildView视图类负责保存和显示数据 应用程序类 SDIApplication NoneDoc View 返回 子框架 视图框架窗口 CChildView视图类 应用程序类 子框架 视图框架窗口 CChildView视图类 主框架 应用程序主框架窗口 MDIApplication NoneDo
10、c View 返回 图3 2MFC应用程序开发过程 类向导 集成开发环境 应用程序向导 资源编辑器 Create def cpp h dsw dsp ico rc bmp 源文件 资源文件 编译 obj Build 资源编译 res 应用程序 5 MFC应用程序创建 6 最简单的MFC应用程序示例 对于一个MFC应用程序来说 只有CWinApp的派生对象是必不可少的 其它类均可视情况进行取舍 下例是一个最简单的MFC应用程序 例 显示一个消息框 1 创建工程 工程类型选择Win32Application 工程名为Ex3 0 2 创建C 源文件 文件名Ex3 0 cpp 内容如下 include
11、classCEx3 0App publicCWinApp CWinApp派生类public virtualBOOLInitInstance MessageBox NULL SimplistMFCApplication Ex3 0 MB OK returnTRUE CEx3 0ApptheApp 全局变量 代表应用程序本身 CWinApp InitInstance 虚函数完成应用程序的初始化工作 派生的应用程序类都要重载此函数进行初始化 如完成主框架窗口的构造 窗口定义显示等工作 3 设置使用MFC 选择Project Settings 菜单项 选择General页面 在MicrosoftFou
12、ndationClasses组合框中选择UseMFCinasharedDLL 4 编译生成并运行此工程 结果显示一个消息框 如下图 图3 3最简单MFC应用示例 3 2 MFC程序设计 MFC应用程序的执行过程 参见图3 4 1 构造全局对象 CWinApp派生类对象 2 运行由应用程序框架提供的WinMain函数 图3 4MFC应用程序的执行过程 3 在WinMain中 通过afxGetApp 获得全局对象的指针pApp 调用全局函数AfxWinInit 为CWinApp的成员变量m hInstance m hPrevInstance m lpCmdLine m nCmdShow赋初值 然后
13、调用pApp InitApplication 这是CWinApp的虚函数 一般不需要改写 调用pApp InitInstance 每个程序都必需改写这个函数 进行应用程序初始化 4 在InitInstance 函数中 先用new构造一个CFrameWnd派生类对象 其构造函数又调用Create 创建主窗口 MFC依此自动为应用程序注册窗口类 调用ShowWindow 显示窗口 调用UpdateWindow 发出WM PAINT消息 5 回到WinMain中 调用pApp Run 进入消息循环 通过API函数GetMessage 获得消息 TranslateMessage 处理消息 Dispat
14、chMessage 派送消息到CWnd DefWindowProc DefWindowProc 按照消息映射表的定义将消息分发到各相应消息处理函数 如消息队列为空 则Run调用CWinApp OnIdle 进行空闲处理 重载OnIdle 可以去处理后台程序 低优先级 6 若用户选择菜单File Close 则程序收到WM COLSE消息 调用 DestroyWindow 发出WM DESTROY消息 然后调PostQuitMessage 发出WM QUIT消息 此时Run会结束其内部消息循环 调用ExitInstance 7 最后 返回WinMain 执行WinTerm 结束程序运行 几点解释
15、 1 每个MFC应用都有stdafx h头文件 由应用程序向导自动生成 2 每个MFC应用都应包含头文件afxwin h 其内部又包含了其他头文件 3 每一个MFC应用程序都包含唯一的CWinApp派生类对象 代表应用程序本身 4 MFC应用程序中看不到WinMain 入口函数 它被封装在应用程序框架里 运行时自动调用 3 2 2 MFC消息映射 消息映射 MessageMap 机制 消息映射机制规定每个要响应消息的类定义自己的消息映射表 将消息与处理消息的函数联系在一起 当事件发生产生消息时 在程序中各个类的消息映射表中查找 当找到消息处理函数时 便将消息送至对应的消息处理函数进行处理 每个
16、从CCmdTarget所派生的类都可以接收消息 都可以定义自己的消息映射表MessageMap 消息映射表 1 消息消息是Windows用来通知MFC应用程序事件发生的主要方式 应用程序的行为取决于对消息的响应方式 MFC把消息分为三大类 1 标准Windows消息 WM XXX 2 命令消息 WM COMMAND 3 控件通知消息 2 消息映射消息映射将消息与应用程序提供的处理该消息的成员函数联系在一起 一组消息映射构成消息映射表 消息映射表由BEGIN MESSAGE MAP和END MESSAGE MAP这一对宏作开始和结束 中间是若干消息映射入口每一个入口由特定的消息宏ON XXX组成 将一个消息与与之对应的处理函数联系在一起 定义和使用消息映射表的步骤 在头文件的类声明中添加DECLARE MESSAGE MAP宏声明消息映射 例如 在类的定义文件 cpp 定义消息映射表 方法是在文件的开始处添加BEIGN MESSAGE MAP和END MESSAGE MAP这一对宏 在它们之间放置消息映射宏 定义并初始化消息映射表 在消息与处理消息的函数之间建立联系 例如 在类的定义文件