子任务1 MFC应用程序概述.ppt_第1页
子任务1 MFC应用程序概述.ppt_第2页
子任务1 MFC应用程序概述.ppt_第3页
子任务1 MFC应用程序概述.ppt_第4页
子任务1 MFC应用程序概述.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

子任务1 简单MFC应用程序设计2 1Windows应用程序概述2 2MFC应用程序框架2 3消息映射与消息处理2 4程序调试2 5应用实例 VisualC 程序设计与应用教程 第2章 2 2 1Windows应用程序概述 Windows应用程序运行于Windows操作系统上 与DOS应用程序有着本质的区别 所有的Windows应用程序都是由消息驱动的 消息处理是所有Windows应用程序的核心 3 2 1 1窗口 窗口是用户界面中最重要的部分 它是屏幕上与一个应用程序相对应的矩形区域 是用户与产生该窗口的应用程序之间的可视界面 4 窗口是由应用程序创建的一个用于接收用户输入和显示输出的矩形区域 是系统管理应用程序的基本单位 窗口由 非客户区 和 客户区 组成 非客户区由系统绘制 包括菜单 工具栏 最大化按钮等 客户区由应用程序绘制 用于输出数据和接受用户的输入 当用户启动一个程序时 一个窗口就创建了 用户每次单击窗口 应用程序就会作出响应 关闭一个窗口会使应用程序结束 编写一个Windows应用程序首先应创建一个或多个窗口 随后应用程序的运行过程即是窗口内部 窗口与窗口之间 窗口与系统之间进行数据处理与数据交换的过程 5 2 1 2消息和事件 Windows是一个基于事件的消息驱动系统 Windows应用程序是按照 事件 消息 处理 非顺序的机制运行的 所谓消息 就是用于描述某个事件发生的信息 而事件是对于Windows的某种操作 事件是因 消息是果 事件产生消息 消息对应事件 所谓消息的处理 其实质就是事件的处理 当有某个事件 如单击鼠标 键盘输入和执行菜单命令等 发生时 Windows会根据具体的事件产生对应的消息 并发送到指定应用程序的消息队列 应用程序从消息队列中取出消息 并根据不同的消息进行不同的处理 6 初始化应用程序 初始化并创建应用程序窗口 进入消息循环并获取消息 是否是WM QUIT消息 是否是应用程序处理的消息 输入消息 系统消息 消息处理函数 开始 默认处理函数 结束 windows应用程序的执行过程 Y N N Y 7 2 1 3基本数据类型 Windows编程中常用的基本数据类型的别名 8 9 2 1 4句柄 句柄是Windows编程的基础 所谓句柄就是Windows使用的一种无重复整数 句柄主要用来标识应用程序中的一个对象 如窗口 实例 菜单 内存 输出设备 控制或文件等 WINDOWS应用程序只能访问句柄 不能直接访问句柄所指的实际数据 1 句柄是一个4字节的整数 Windows利用它标识应用程序创建和使用的资源 包括应用程序实例 窗口 菜单 控件 内存 外设 文件以及与图形相关的画笔 刷子等 2 句柄是Windows内部表资源数据存储的内存索引值 Windows利用它可以访问表中的信息 通常 在程序中要访问某个资源时 需要提供该资源的句柄 因此 句柄可理解为是内存的索引值 10 Windows常见的公用句柄类型如下表所示 11 由于对应的MFC类已对句柄进行了封装 大多数情况下不再需要访问句柄 句柄是消息与API函数的参数 采用MFC编写应用程序时 可以通过访问类的一个public的成员变量来得到某个对象的句柄 12 2 2MFC应用程序框架 下面通过一个实例介绍利用MFCAppWizard exe 创建应用程序框架的步骤 2 2 1创建MFC应用程序框架 13 例2 1 编写一个SDI单文档应用程序Li2 1 程序运行后 通过消息框输出 这是一个单文档应用程序 的提示信息 1 选择File菜单下的New菜单项 系统弹出New对话框 单击 输入 工程名 保存文件路径 默认 14 单文档界面 SDI 应用程序 应用程序运行时 只能打开一个文档 多文档界面 MDI 应用程序 应用程序可以同时打开多个文档 基于对话框的应用程序 应用程序将显示一个简单的对话框来处理用户的输入 2 MFCAppWizard Step1对话框主要用于选择应用程序类型 AppWizard可以创建3种类型的应用程序框架 语言种类 是否支持文档 视图结构 15 3 MFCAppWizard Step2of6对话框中主要用于选择应用程序所支持数据库方式 不包含任何数据库支持 包含最低限度的数据库支持 创建对应表的一个数据库类和一个视图类 不附加标准文件支持 创建对应表的一个数据库类和一个视图类 并附加标准文件支持 16 4 在MFCAppWizard Step3of6对话框中选择应用程序所支持的复合文档类型 不支持任何复合文档 应用程序作为复合文档容器 包含可以链接或嵌入的ActiveX对象 应用程序仅仅可以创建能够嵌入到其他应用程序中的文档 但是不能作为一个单独运行的应用程序 应用程序可以单独运行 同时也可以作为一个对象嵌入到其他应用程序中 应用程序能够作为容器包含嵌入或链接的ActiveX对象 同时也能够作为一个可以嵌入到其他程序中的对象 17 5 在MFCAppWizard Step4of6对话框中设置应用程序的外观特征 添加工具栏 自动生成状态栏 添加打印和打印预览菜单项 在帮助菜单中自动添加索引和使用帮助菜单项 使应用程序的外观呈三维显示 消息应用程序接口 应用程序具有TCP IP通信功能 传统风格工具条 InternetExplorer风格工具条 18 6 在MFCAppWizard Step5of6对话框中设置应用程序的风格 创建标准的MFC应用程序 创建类似于Windows资源管理器风格的应用程序 在生成的程序框架的源文件中加入注释 不加入注释信息 使用动态链接库 使用静态链接库 19 7 在MFCAppWizard Step6of6对话框中 可以设置向导生成的文件名和类名 设置类名 设置文件名 20 8 打开项目工作区中的ClassView类视图 单击CLi2 1View类左边的 展开视图类 双击打开OnDraw 函数 并添加代码 voidCLi2 1View OnDraw CDC pDC CLi2 1Doc pDoc GetDocument ASSERT VALID pDoc TODO adddrawcodefornativedatahereMessageBox 这是一个单文档应用程序 消息框 MB ICONEXCLAMATION MB OKCANCEL 21 9 选择Build菜单中的BuildLi2 1 exe菜单项 对工程进行编译和链接 生成可执行文件 再选择Build菜单中的ExecuteLi2 1 exe菜单命令运行程序 22 MFC应用程序框架结构类的继承关系 2 2 2MFC应用程序框架结构类 根类 命令相关类 应用程序类 窗口类 文档类 视图类 框架窗口类 线程基类 23 1 CObject类CObject是MFC类库的根类 它几乎描述了所有MFC类的一些公共特性 并且给所有由它派生出的类提供了3种重要特性 即 串行化支持 运行时类信息支持以及诊断和调试支持 2 CCmdTarget类命令类CCmdTarget是CObject的子类 它是MFC库中所有具有消息映射属性的类的公共基类 从CCmdTarget派生的类能在程序运行时动态创建对象和处理命令消息 24 3 CWinApp类应用程序类CWinApp是CWinThread的子类 封装了初始化 运行 终止应用程序的代码 可以由此派生自己的应用类 4个成员函数实现传统的应用程序winMain 的工作 InitInstance 应用程序的初始化 创建文档模板 文档 视图与主窗口 Run 隐藏在基类中 发送应用程序的消息到窗口 保持应用程序的正常运行 处理消息循环 OnIdle 无窗口消息需处理时 被窗口框架调用 ExitInstance 退出程序是 被调用 25 5 CFrameWnd类CFrameWnd类是CWnd类的派生类 它是所有其他框架窗口类的基类 主要用来管理一个窗口 CFrameWnd类的对象是一个框架窗口 包括边框 标题栏 菜单 最大化按钮 最小化按钮和一个激活的视图 CFrameWnd类支持单文档界面 对于多文档界面 使用它的两个派生类CMDIFrameWnd和CMDIChildWnd CMDIFrameWnd类用于MDI的主窗口 CMDIChildWnd类用于MDI的子窗口 4 CWnd类窗口类CWnd提供了MFC中所有窗口类的基本功能 从CWnd派生的类可以拥有自己的窗口 并对它进行控制 26 6 CView类视图类CView是CWnd类的子类 视图类及其派生类用于管理框架窗口的客户区 7 CDocument类文档类CDocument负责装载和维护文档 文档包括应用程序的工作成果或环境设置数据等 可以是程序需要保存的任何内容 27 一个MFC应用程序并不直接操作上述类 而是以上述类为基类派生新的类 从而构建Windows应用程序的基本框架 例如 应用程序Li2 1中的类与这些基类的派生关系 8 CDocTemplate类文档模板类定义了文档模板的基本功能 它是一个抽象类 不能直接使用 只能用其派生类 28 练习 29 1 应用程序向导生成的文件下面以例2 1中创建的应用程序Li2 1为例 介绍MFCAppWizard exe 向导所生成的各类文件及功能 2 2 3MFC应用程序分析 30 1 头文件与实现文件MainFrm h和MainFrm cpp 定义和实现窗口框架类CMainFrame CLi2 1Doc h和CLi2 1Doc cpp 定义和实现文档类CLi2 1Doc CLi2 1View h和CLi2 1View cpp 定义和实现视图类CLi2 1View CLi2 1 h和CLi2 1 cpp 定义和实现应用程序类CLi2 1App Resource h 定义工程中所有资源标识符 给资源ID分配一个整数值 StdAfx h和StdAfx cpp 用于建立一个预编译的头文件CLi2 1 PCH和一个预定义的类型文件StdAfx obj 加速编译过程 一般不修改 31 2 资源文件Li2 1 rc和Li2 1 rc2 Li2 1 rc文件是程序所使用的所有Windows资源的列表 Li2 1 ico 应用程序的图标所使用的图标文件 Li2 1Doc ico 应用程序的文档图标文件 文档图标一般显示在多文档程序界面上 Toolbar bmp 工具栏按钮的位图文件 32 3 项目工作区文件和工程文件Li2 1 dsw 保存当前工作区所包含的工程的信息 Li2 1 dsp 包含当前工程的设置 工程中的文件等信息 33 4 其他文件Li2 1 clw 该文件是类信息文件 它保存了ClassWizard编辑现有类或增加新类时需使用的类信息 同时还保存了创建 编辑消息映射和成员函数所需的信息 ReadMe txt 该文件是工程自述文件 主要介绍所创建文件的内容和功能 以及添加用户代码 更改使用语言的方法 34 2 应用程序的运行机制 程序开始 初始化全局对象theApp CWinApp类构造函数 CHelloApp类构造函数 AfxWinMain 函数 pApp InitInstance 调用ProcessShellCommand 创建主框架窗口对象 视图对象 文档对象 创建主框架窗口和视图窗口并显示 CWinThread Run WM QUIT 消息循环 结束 pApp Run CHelloApptheApp CWinApp pApp AfxGetApp WinMain pApp InitApplication ExitInstance 35 2 应用程序的执行过程 启动 创建应用程序对象theApp 调用应用程序类的构造函数初始化对象theApp 应用程序框架调用MFC提供的AfxWinMain 主函数 AfxWinMain 主函数 首先通过调用全局函数AfxGetApp 来获取theApp的指针pApp 然后通过该指针调用theApp的成员函数InitInstance 来初始化应用程序 36 在应用程序的初始化过程中 同时还构造了文档模板 产生最初的文档 视图和主框架窗口 并生成工具栏和状态栏 当InitInstance 函数执行完毕后 WinMain 函数将调用成员函数Run 进入消息处理循环 函数Run 收到WM QUIT消息 MFC首先调用CWinApp类的成员函数ExitInstance 然后调用静态对象的析构函数 退出应用程序 将控制权交给操作系统 37 分析例2 1中的消息对话框 一种简单的对话框 用户可以直接调用消息对话框函数来使用它 而不需要自己创建 VisualC 提供三个消息对话框函数 它们的原型为 intAfxMessageBox LPCTSTRlpText UINTnType MB OK UINTnIDHelp 0 intMessageBox HWNDhWnd LPCTSTRlpText LPCTSTRlpCaption UINTnType intCWnd MessageBox LPCTSTRlpText LPCTSTRlpCaption NULL UINTnType MB OK 只能用于控件 对话框 窗口等一些类中 可以用在程序的任意地方 38 39 40 2 2 4文档 视图结构 文档 视图体系结构是MFC应用程序框架结构的基石 它定义了一种程序结构 这种结构利用文档对象保存应用程序的数据 依靠视图对象控制视图显示数据 文档与视图的关系是一对多的关系 也就是说 文档中的数据可以以不同的方式显示 41 42 2 3消息映射与消息处理 Windows消息主要有3种类型 标准Windows消息 控件消息和命令消息 1 标准Windows消息除WM COMMAND以外 所有以 WM 为前缀的消息都是标准Windows消息 由窗口类或视图类处理 都有默认的处理函数 它们在CWnd类中进行了预定义 默认前缀On 如 afx msgvoidOnChar 2 3 1消息的类别及其描述 消息映射 把消息处理函数与其要处理的消息连起来 43 标准的Windows消息又分为3类 键盘消息 鼠标消息和窗口消息 1 键盘消息键盘消息与键盘某个键的动作相关联 常见的键盘消息有以下几种 WM KEYDOWN WM KEYUP 按下 释放非系统键产生的消息 WM CHAR 输入非系统字符时产生的消息 如 afx msgvoidOnChar UINTnChar UINTnRepCnt UINTnFlags 44 2 鼠标消息鼠标消息涉及到鼠标的单击 双击 拖动等 常用的鼠标消息有以下几种 WM MOUSEMOVE 鼠标移动时产生的消息 WM RBUTTONDOWN 鼠标右键按下时产生的消息 WM LBUTTONDOWN 鼠标左键按下时产生的消息 WM LBUTTONDBLCLICK 鼠标双击时产生的消息 如 afx msgvoidOnLButtonDown UINTnFlags CPointpoint 45 3 窗口消息窗口消息一般与创建窗口 绘制窗口 移动窗口和销毁窗口等动作有关 在MFC应用程序中 窗口消息是由视图类 窗口类及它们的派生类处理的 常见的窗口消息 WM PAINT 客户区有移动或显示事件 窗口大小改变事件等发送WM TIMER 每当计时器被触发时发送 46 2 控件消息控件消息是指控件或其他子窗口向父窗口发送的WM COMMAND消息 与其他标准的Windows消息一样 控件消息也应该在视图类 窗口类中进行处理 但是 如果用户单击按钮控件时 发出的控件通知消息BN CLICKED将作为命令消息来处理 例如 用户向编辑框中的文本进行修改 编辑框将发送给父窗口一条含控件通知码的WM COMMAND消息 47 3 命令消息命令消息是由菜单项 工具栏按钮 快捷键等用户界面对象发出的WM COMMAND消息 命令消息与其他消息不同 它可被更广泛的对象如文档 文档模板 应用程序对象 窗口和视图等处理 48 2 3 2MFC消息映射机制 MFC采用消息映射来处理消息 消息映射机制包括一组消息映射宏 用于把一个Windows消息和其消息处理函数联系起来 所有从CCmdTarget类派生出来的类都能够拥有自己的消息映射 与MFC消息映射机制有关的宏有以下3个 DECLARE MESSAGE MAP BEGIN MESSAGE MAP MyClass MybaseClass END MESSAGE MAP 49 为了使用消息映射宏 首先在类定义的结尾用DECLARE MESSAGE MAP 宏来声明使用消息映射 该宏表示在为各个处理函数所写的类声明之后存在消息映射条目 这些函数是该类的成员函数 然后在类的实现源文件中用BEGIN MESSAGE MAP 和END MESSAGE MAP 宏来定义消息映射 50 为了在一个处理消息的类中加入消息映射表 要在该类的类声明中 一般在头文件中 添加下面的宏调用 DECLEAR MESSAGE MAP 这条宏语句一般放在类定义的最后 例如 有一个CMyClass类 并想给类加上消息映射 则必须先在类定义中加入DECLEAR MESSAGE MAP 函数 classCMyClass publicCObject DECLEAR MESSAGE MAP 1 声明消息映射 51 MFC应用程序MESSAG MAP消息映射的形式如下 BEGIN MESSAGE MAP MyClass MybaseClass AFX MSG MAP MyClass ClassWizard维护消息映射宏的标记ON MFC预定义消息映射宏ON MESSAGE message memberFun 用户自定义消息映射宏 AFX MSG MAPEND MESSAGE MAP 其中 MyClass是拥有消息映射的派生类名 MybaseClass是其基类名 52 2 实现消息映射消息映射提供了与C 中的虚函数类似的功能 消息处理方法可以位于派生类层次的任何地方 MFC使用消息映射结构去搜索所有派生类 直到它找到给定的消息处理函数为止 在搜索过程中会沿着MFC类层次上溯至CCmdTarget类 消息映射机制是一种比虚函数更快捷更高效的方法 实现类的消息映射时需要在类的实现文件 cpp 中加上消息映射表 如下面的程序片段 BEGIN MESSAGE MAP CMouseMoveView CView AFX MSG MAP CMouseMoveView ON WM MOUSEMOVE AFX MSG MAP 标准打印命令ON COMMAND ID FILE PRINT CView OnFilePrint ON COMMAND ID FILE PRINT DIRECT CView OnFilePrint ON COMMAND ID FILE PRINT PREVIEW CView OnFilePrintPreview END MESSAGE MAP 53 例2 2 利用ClassWizard为例2 1中生成的应用程序Li2 1添加鼠标右键按下消息 即WM RBUTTONDOWN消息 并为File菜单下的Open菜单项添加消息处理函数 分析ClassWizard类向导所进行的消息映射 P35 54 练习 55 2 3 3自定义消息处理 自定义消息处理 定义消息名 分配ID值及完成消息映射 Windows将所有的消息值分为4段 0 x0000 0 x03FF段 用于Windows系统消息0 x0400 0 x7FFF段 用于用户自定义的窗口消息0 x8000 0 xBFFF段 为Windows保留值0 xC000 0 xFFFF段 用于应用程序的字符串消息 56 常量WM USER 为0 x0400 与第一个自定义消息值相对应 用户必须为自己的消息定义相对于WM USER的偏移值 利用 define语句直接定义自己的消息 如下所示 defineWM USERWM USER 3 自定义消息WM USER也可以调用窗口消息注册函数RegisterWindowMessage 来定义一个Windows消息 由系统分配消息一个整数值 该函数原型为 UINTRegisterWindowMessage LPCTSTRlpString 其中参数lpString是要定义的消息名 调用成功后将返回该消息的ID值 57 例2 3 编写一个自定义消息应用程序 并添加WM RBUTTONDOWN消息 当程序运行时 用户在视图窗口中单击鼠标右键 则调用自定义消息处理函数 输出文本 自定义消息WM MYMESSAGE的处理函数被调用 P37 defineWM MYMESSAGEWM USER 1 自定义消息afx msgLRESULTOnMyMessage WPARAMwParam LPARAMlParam ON MESSAGE WM MYMESSAGE OnMyMessage 自定义消息映射宏 LRESULTCLi2 3View OnMyMessage WPARAMwParam LPARAMlParam MessageBox 自定义消息WM MYMESSAGE的处理函数被调用 return0 SendMessage WM MYMESSAGE 58 2 4程序调试 程序调试分为源程序语法错误的修改和程序逻辑设计错误的修改两个阶段 编译器只能找出源程序的语法错误 程序的逻辑设计错误只能靠程序员利用调试工具来手工检查和修改 59 2 4 1查找源程序中的语法错误语法错误分为 一般错误 error 出现该错误时将不会产生可执行程序 警告错误 warning 出现该错误时能够生成可执行程序 但程序运行时可能发生错误 严重的warning错误还会引起死机现象 60 如果程序有语法错误 则在执行编译 链接命令时 VisualC 编译器将在输出窗口中给出语法错误提示信息 但链接错误提示信息不能给出错误发生的具体位置 在输出窗口中双击错误提示信息或按F4键可以返回到源程序编辑窗口 并通过一个箭头符号定位到产生错误的语句 说明 编译器的错误提示可能不十分准确 一处错误可能引发多个错误提示 所以修改一个错误最好马上编译 61 2 4 2调试器为了查找和修改程序中的逻辑设计错误 VisualC IDE提供了重要的调试工具 Debug 单击Build StartDebug菜单中的菜单项 可以启动Debug 62 StartDebug子菜单中有Go StepInto RunToCursor及AttachtoProcess菜单项 开始或继续调试程序 到某个断点 程序的结束或需要用户输入的地方停止 程序执行到当前光标处 相当于在光标处临时设置了一个断点 单步执行程序的每一个指令 能进入被调用的函数内部 将调试器与一个正在运行的进程相连接 63 调试过程开始后 Debug主菜单取代Build主菜单出现在菜单栏中 同时出现一个可停靠的调试工具栏和一些调试窗口 64 Auto 显示当前语句或前一语句中变量的值或函数返回值 Locals 显示当前函数局部变量的名称 值与类型 this 以树型方式显示当前类对象的所有数据成员 Variable窗口 Watch窗口 观察与修改变量或表达式的值 65 即使源程序没有语法错误 但最后生成的可执行程序也没有像程序设计要求的那样运行 这类程序设计上的错误被称为逻辑设计错误或缺陷 bug 跟踪调试程序是查找此类逻辑设计错误方法中最常采用的动态方法 跟踪调试的基本原理就是在程序运行过程的某一阶段观测程序的状态 而在一般情况下程序是连续运行的 所以我们必须使程序在某一点停下来 2 4 3跟踪调试程序 66 选择Edit菜单下的Breakpoints菜单项 显示Breakpoints对话框 1 设置断点 设置断点

温馨提示

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

评论

0/150

提交评论