




已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章MFC应用程序框架 崔树芹 主要内容 2 1用MFC向导生成应用程序2 2应用程序框架分析2 3文档与视图2 4工具栏和状态栏2 5 2 7MFC新功能2 8应用程序框架类对象分析 2 1用MFC向导生成应用程序 用AppWizard应用程序向导生成MFC应用程序 单文档应用程序多文档应用程序对话框应用程序用ClassWizard工具生成派生类 定义处理消息 管理对话框 定制MFC成员函数 2 1用MFC向导生成应用程序 演示MFC向导生成常用的三种应用程序 2 1 2生成的应用程序类型 基于对话框的应用程序CWinApp CDialog类 2 1 2生成的应用程序类型 单文档应用程序CWinApp CFrameWnd CView CDocument 2 1 2生成的应用程序类型 多文档应用程序CWinApp CMDIFrameWnd CMDIChildWnd CView CDocument 2 1 3向导生成工程文件简介 头文件与实现文件各个类的 h和 cppResource h 定义工程中所有资源标识符 给资源ID分配一个整数值 StdAfx h和StdAfx cpp 用于建立一个预编译的头文件 资源文件 rc和 rc2 是程序所使用的所有Windows资源的列表 ico 应用程序的图标所使用的图标文件 Doc ico 应用程序的文档图标文件 文档图标一般显示在多文档程序界面上 Toolbar bmp 工具栏按钮的位图文件 2 1 3向导生成工程文件简介 解决方案文件和工程文件 sln 保存当前解决方案所包含的工程的信息 vcxproj 包含当前工程的设置 工程中的文件等信息 MFC应用程序框架结构类的继承关系 2 2应用程序框架分析 2 2 1框架简介 1 CObject类CObject是MFC类库的根类 它几乎描述了所有MFC类的一些公共特性 并且给所有由它派生出的类提供了3种重要特性 即 串行化支持 运行时类信息支持以及诊断和调试支持 2 CCmdTarget类命令类CCmdTarget是CObject的子类 它是MFC库中所有具有消息映射属性的类的公共基类 从CCmdTarget派生的类能在程序运行时动态创建对象和处理命令消息 3 CWinApp类 应用程序类在类族中的位置 WinMain函数的函数体的封装 支持线程管理 2 2 1框架简介 应用程序类CWinApp是CWinThread的子类 封装了初始化 运行 终止应用程序的代码 可以由此派生自己的应用类 指向框架窗口的指针m pMainWnd 2 2 1框架简介 CWinApp类中定义了三个可以重写的虚函数 InitInstance 程序创建和显示窗口 程序设计时 必须以CWinApp类为基类派生自己的应用程序类 并根据情况重写InitInstance Run 处理消息循环 ExitInstance 程序结束时做收尾工作 2 2 1框架简介 4 文档模板类CDocTemplate 单一的文档指针 2 2 1框架简介 文档类链表 查阅CPtrList类 2 2 1框架简介 RUNTIME CLASS分别创建了doc view和窗口框架类的对象 2 2 1框架简介 5 CFrameWnd类CFrameWnd类是CWnd类的派生类 它是所有其他框架窗口类的基类 主要用来管理一个窗口 CFrameWnd类的对象是一个框架窗口 包括边框 标题栏 菜单 最大化按钮 最小化按钮和一个激活的视图 CFrameWnd类支持单文档界面 对于多文档界面 使用它的两个派生类CMDIFrameWnd和CMDIChildWnd CMDIFrameWnd类用于MDI的主窗口 CMDIChildWnd类用于MDI的子窗口 2 2 1框架简介 6 CView类视图类CView是CWnd类的子类 视图类及其派生类用于管理框架窗口的客户区 7 CDocument类文档类CDocument负责装载和维护文档 文档包括应用程序的工作成果或环境设置数据等 可以是程序需要保存的任何内容 2 2 1框架简介 为应用程序框架提供客户区 承担用户数据的显示 同时替代窗口框架接收外界的输入 因此 该类是程序员编码最多的地方 派生关系 与文档类的联系纽带 用户区的绘制 注意 谁来触发1 自动重绘 2 手动视图更新 2 2 1框架简介 应用程序的文档类由CDocument派生 Serialize 函数 文件操作时响应ReaddatafromfileWritedatatofile 序列化 串行化Serialization 2 2 1框架简介 各对象之间的关系 2 2 1框架简介 CWinApptheApp theApp InitInstance 1 应用程序各对象的创建顺序 2 2 2MFC应用程序运行流程 2 2 2MFC应用程序运行流程 2 应用程序的执行过程启动 创建应用程序对象theApp 调用应用程序类的构造函数初始化对象theApp 应用程序框架调用MFC提供的AfxWinMain 主函数 AfxWinMain 主函数 首先通过调用全局函数AfxGetApp 来获取theApp的指针pApp 然后通过该指针调用theApp的成员函数InitInstance 来初始化应用程序 在应用程序的初始化过程InitInstance中 同时还构造了文档模板 产生最初的文档 视图和主框架窗口 并生成工具栏和状态栏 2 2 2MFC应用程序运行流程 当InitInstance 函数执行完毕后 AfxWinMain 函数将调用成员函数Run 进入消息处理循环 函数Run 收到WM QUIT消息 MFC首先调用CWinApp类的成员函数ExitInstance 然后调用静态对象的析构函数 退出应用程序 将控制权交给操作系统 WinMain AfxWinMain 应用程序初始化 消息循环 C ProgramFiles MicrosoftVisualStudio10 0 vc atlmfc src winmain cpp 2 2 2MFC应用程序运行流程 2 2 3应用程序窗口 重叠窗口弹出窗口子窗口 Windows消息主要有3种类型 标准Windows消息 控件消息和命令消息 1 标准Windows消息除WM COMMAND以外 所有以 WM 为前缀的消息都是标准Windows消息 由窗口类或视图类处理 都有默认的处理函数 它们在CWnd类中进行了预定义 1 消息的类别及其描述 2 2 4消息机制与消息循环 标准的Windows消息又分为3类 键盘消息 鼠标消息和窗口消息 1 键盘消息键盘消息与键盘某个键的动作相关联 常见的键盘消息有以下几种 WM KEYDOWN WM KEYUP 按下 释放键产生的消息 WM CHAR 输入字符时产生的消息 2 2 4消息机制与消息循环 2 鼠标消息鼠标消息涉及到鼠标的单击 双击 拖动等 常用的鼠标消息有以下几种 WM MOUSEMOVE 鼠标移动时产生的消息 WM RBUTTONDOWN 鼠标右键按下时产生的消息 WM LBUTTONDOWN 鼠标左键按下时产生的消息 WM LBUTTONDBLCLICK 鼠标双击时产生的消息 2 2 4消息机制与消息循环 3 窗口消息窗口消息一般与创建窗口 绘制窗口 移动窗口和销毁窗口等动作有关 在MFC应用程序中 窗口消息是由视图类 窗口类及它们的派生类处理的 2 2 4消息机制与消息循环 2 控件消息控件消息是指控件或其他子窗口向父窗口发送的消息 与其他标准的Windows消息一样 控件消息也应该在视图类 窗口类中进行处理 但是 如果用户单击按钮控件时 发出的控件通知消息BN CLICKED将作为命令消息来处理 2 2 4消息机制与消息循环 3 命令消息命令消息是由菜单项 工具栏按钮 快捷键等用户界面对象发出的WM COMMAND消息 命令消息与其他消息不同 它可被更广泛的对象如文档 文档模板 应用程序对象 窗口和视图等处理 2 MFC消息映射机制 MFC采用消息映射来处理消息 消息映射机制包括一组消息映射宏 用于把一个Windows消息和其消息处理函数联系起来 所有从CCmdTarget类派生出来的类都能够拥有自己的消息映射 与MFC消息映射机制有关的宏有以下3个 DECLARE MESSAGE MAP BEGIN MESSAGE MAP MyClass MybaseClass END MESSAGE MAP 2 2 4消息机制与消息循环 为了使用消息映射宏 首先在类定义的结尾用DECLARE MESSAGE MAP 宏来声明使用消息映射 该宏表示在为各个处理函数所写的类声明之后存在消息映射条目 这些函数是该类的成员函数 然后在类的实现源文件中用BEGIN MESSAGE MAP 和END MESSAGE MAP 宏来定义消息映射 MFC应用程序MESSAG MAP消息映射的形式如下 2 2 4消息机制与消息循环 BEGIN MESSAGE MAP MyClass MybaseClass AFX MSG MAP MyClass ClassWizard维护消息映射宏的标记ON MFC预定义消息映射宏ON MESSAGE message memberFun 用户自定义消息映射宏 AFX MSG MAPEND MESSAGE MAP 其中 MyClass是拥有消息映射的派生类名 MybaseClass是其基类名 2 2 4消息机制与消息循环 2 2 4消息机制与消息循环 3自定义消息处理 自定义消息处理 定义消息名 分配ID值及完成消息映射 Windows将所有的消息值分为4段 0 x0000 0 x03FF段 用于Windows系统消息0 x0400 0 x7FFF段 用于用户自定义的窗口消息0 x8000 0 xBFFF段 为Windows保留值0 xC000 0 xFFFF段 用于应用程序的字符串消息 2 2 4消息机制与消息循环 常量WM USER 为0 x0400 与第一个自定义消息值相对应 用户必须为自己的消息定义相对于WM USER的偏移值 利用 define语句直接定义自己的消息 如下所示 defineWM HIDEWM USER 3 自定义消息WM USER也可以调用窗口消息注册函数RegisterWindowMessage 来定义一个Windows消息 由系统分配消息一个整数值 该函数原型为 UINTRegisterWindowMessage LPCTSTRlpString 其中参数lpString是要定义的消息名 调用成功后将返回该消息的ID值 2 2 4消息机制与消息循环 2 2 4消息机制与消息循环 自定义消息方法的步骤 1 定义消息 defineWM HIDEWM USER 1012 在类头文件的AFX MSG块中声明消息处理函数 classCMainFrame publicCFrameWnd protected AFX MSG CMainFrame afx msgintOnCreate LPCREATESTRUCTlpCreateStruct afx msgvoidOnTimer UINTnIDEvent afx msgLRESULTOnHide WPARAMwParam LPARAMlParam AFX MSGDECLARE MESSAGE MAP 2 2 4消息机制与消息循环 3 在类的实现文件中 使用ON MESSAGE宏指令将消息映射到消息处理表中 BEGIN MESSAGE MAP CMainFrame CFrameWnd AFX MSG MAP CMainFrame ON WM CREATE ON WM TIMER ON MESSAGE WM HIDE OnProgress 注意这条语句的后面没有分号 AFX MSG MAPEND MESSAGE MAP 2 2 4消息机制与消息循环 4 实现消息处理函数 该函数使用WPRAM和LPARAM参数并返回LRESULT LRESULTCMainFrame OnHide WPARAMwParam LPARAMlParam MessageBox T 我的消息 return0 2 2 4消息机制与消息循环 5 在适当的时候发送自定义消息 进行消息处理 需要注意使用SendMessage还是PostMessage进行处理 SendMessage是消息处理完毕后再返回 而PostMessage则是把消息放到消息队列后立即返回 SendMessage theApp GetMainWnd GetSafeHwnd WM PROGRESS 0L 0L 如果用户需要整个系统唯一的消息 可以调用SDK函数RegisterWindowMessage并使用ON REGISTER MESSAGE宏指令取代ON MESSAGE宏指令 其余步骤同上 2 2 4消息机制与消息循环 SendMessage函数原型LRESULTSendMessage HWNDhWnd UINTMsg WPARAMwParam LPARAMlParam hWnd 其窗口程序将接收消息的窗口的句柄 Msg 指定被发送的消息号 wParam 指定附加的消息特定信息 lParam 指定附加的消息特定信息 返回值 返回值指定消息处理的结果 依赖于所发送的消息 2 2 4消息机制与消息循环 演示并编写一个自定义消息应用程序 添加WM PROGRESS消息 当程序运行时 则调用自定义消息处理函数 输出文本 自定义消息处理函数被调用 消息传递 标准Windows消息传递直线上溯命令消息传递迂回上溯 消息传递 对于WM COMMAND消息 框架窗口实际上是大多数WM COMMAND消息的接受者 但WM COMMAND消息还可以在视图 文档 甚至应用程序类中被处理 文档 视图体系结构是MFC应用程序框架结构的基石 它定义了一种程序结构 这种结构利用文档对象保存应用程序的数据 依靠视图对象控制视图显示数据 文档与视图的关系是一对多的关系 也就是说 文档中的数据可以以不同的方式显示 2 3文档与视图 2 3文档与视图 文档负责数据读取 存取以及其它的操作 CDocument类本身只是一个空壳 我们需要从它派生一个数据自已的类 并在类中声明我们需要的变量 用以承载数据 CDocument类已经为我们做好了一些重要的函数 其中包括与View类的 沟通 函数 文档存取等函数 表主要的CDocument操作 2 3文档与视图 表主要的CDocument可覆盖函数 2 3文档与视图 用户可通过函数GetFirstViewPosition 和GetNextView 得到和文档关联的视图的指针 代码如下 POSITIONpos GetFirstViewPosition 得到视图列表头的位置While pos NULL CView pView GetNextView pos 获得视图列表中的视图指针 2 3文档与视图 2 3文档与视图 视图类有两个用途 提供文档的可视化表示将用户输入 特别是鼠标和键盘消息 转换为操作文档数据的命令 MFC还包含了一组CView类的派生类 用来完成不同功能的视图 CEditView 简单的文本编辑器 类似NotepadCListView 基于列表的视图 类似文件夹浏览CTreeView 基于树状控件的视图 类似文件浏览左侧的树状结构CRichEditView 支持多种字体 OLE和RTF格式的高级编辑器CScrollView 支持滚动条的视图CFormView 窗体视图 支持在上边使用对话框控件CRecordView 连接到ODBC数据库的视图CDaoRecordView 连接到DAO数据库的视图 CView的子类 2 3文档与视图 2 3文档与视图 一个文档可以具有与其联系的多个视图 而一个视图只能属于一个文档 CView类保存了m pDocument数据成员 并将该指针提供给视图的GetDocument成员函数使用 用以标识出视图类所属的文档 AppWizard为视图类生成源代码时 它覆盖了基类的GetDocument函数 其强制转换了m pDocument为派生类指针 2 3文档与视图 表主要的CView可覆盖函数 2 3文档与视图 OnInitialUpdate与OnUpdate在SDI中 视图与文档一样 只构造一次 重复使用 在SDI中 每当文档被打开或创建时 都要调用视图的OnInitialUpdate OnInitialUpdate 默认要调用OnUpdate OnUpdate 的默认操作是使视图客户区无效并执行重绘 在CView类的派生类中 如果重写了OnInitialUpdate 需要要调用CView OnInitialUpdate 否则新文档被打开或创建时不会被更新 2 3文档与视图 CView OnDraw何时调用 在WM PAINT到来时 当视窗显示区域的一部分显示内容或者全部变为 无效 以致于必须 更新画面 时 将由这个讯息通知程式 在文档被打印时什么是CDCDC DeviceContext 设备描述表 在WM PAINT到来时 DC指向屏幕设备在文档被打印时 DC指向打印机设备 2 3文档与视图 OnPaint 与OnDrawWM PAINT到来时会调用OnPaint 函数 此函数在CView中被定义 WM PRINT到来时会调用OnPrint 函数 此函数在CView中被定义 两个函数都调用了OnDraw 并传送不同的DC 分别代表屏幕设备与打印设备 2 4工具栏与状态栏 2 4工具栏与状态栏 工具栏简介工具栏对象是一种窗口 工具栏中的所有按钮的图形被存储在一个位图中 而该位图被定义在应用程序的资源文件中 工具栏按钮与菜单选项是类似的 单击工具栏按钮将产生相应的命令 应用程序通过提供消息处理函数来处理产生的命令 如果工具栏的某个按钮没有COMMAND或UPDATE COMMAND UI处理函数 那么框架自动使该按钮无效 工具栏和状态栏一般作为框架窗口类的成员变量声明 在创建框架窗口时自动创建它们 在销毁框架窗口时自动销毁所创建的控件栏对象 使用AppWizard创建应用程序基本框架时 可以得到初始的工具栏和状态栏 2 4 1工具栏 系统默认生成的工具栏资源为IDR MAINFRAME 可以在此基础上设计自己的工具栏 删除或添加一些按钮 需要为工具栏按钮提供ID号 一般取某个菜单项的ID 2 4 1工具栏 工具栏的创建 1 创建工具栏资源 2 构造CToolBar对象 即在边框窗口类的声明中添加类似以下的声明 CToolBarm wndToolBar 3 调用Create或CreateEx创建工具栏 然后调用LoadToolBar装载工具栏资源 工具栏的创建 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if m wndToolBar CreateEx this TBSTYLE FLAT WS CHILD WS VISIBLE CBRS TOP CBRS GRIPPER CBRS TOOLTIPS CBRS FLYBY CBRS SIZE DYNAMIC m wndToolBar LoadToolBar IDR MAINFRAME TRACE0 Failedtocreatetoolbar n return 1 failtocreate CToolBarm wndToolBar 工具栏的停靠 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct m wndToolBar EnableDocking CBRS ALIGN ANY EnableDocking CBRS ALIGN ANY DockControlBar 调用Create时还可以指定工具栏的风格 默认风格是WS CHILD WS VISIBLE CBRS TOP CBRS TOP工具栏在边框窗口顶部 CBRS BOTTOM工具栏在边框窗口底部 CBRS NOALIGN边框窗口改变大小时 工具栏不重定位 CBRS TOOLTIPS使工具提示有效 CBRS SIZE DYNAMIC工具栏尺寸可变 CBRS SIZE FIXED工具栏尺寸固定 CBRS FLOATLNG工具栏是浮动的 CBRS FLYBY在状态栏中显示按钮的有关信息 CBRS HIDE INPLANE不显示工具栏 工具栏的创建 停靠方式 CToolBar的EnableDocking 设置工具栏能停靠在何处 CBRS ALIGN ANYCBRS ALIGN TOP CBRS ALIGN LEFTCBRS ALIGN RIGHT CBRS ALIGN BOTTOMCMainFrame类的EnableDocking 设置能让工具栏停靠在何处 调用DockControlBar 完成工具栏停靠 具体效果由上面的两个EnableDocking共同决定 2 4 1工具栏 演示在系统提供的工具栏上添加并编辑新的工具栏按钮 产生消息响应 2 4 1工具栏 创建新工具栏资源定义工具栏对象MainFrm h中protected CStatusBarm wndStatusBar CToolBarm wndToolBar CToolBarm wndTool1 系统的工具栏 第二个工具栏 多工具栏实现 创建 intCMainFrame OnCreate if m wndToolBar CreateEx m wndToolBar LoadToolBar IDR MAINFRAME TRACE0 Failedtocreatetoolbar n return 1 if m wndTool1 CreateEx m wndTool1 LoadToolBar IDR TOOL TRACE0 Failedtocreatetoolbar n return 1 failtocreate 多工具栏实现 停靠 intCMainFrame OnCreate m wndToolBar EnableDocking CBRS ALIGN ANY m wndTool1 EnableDocking CBRS ALIGN ANY EnableDocking CBRS ALIGN ANY DockControlBar 只需调用一次 隐藏和显示工具栏 ShowControlBar true显示false隐藏 是否立即显示 false立即显示 2 4 2状态栏 状态栏可以显示与上下文有关的工具栏按钮和菜单项的帮助信息 在Windows中已经变的非常普遍 2 4 2状态栏 状态栏的定义用AppWizard创建的SDI或MDI应用程序框架中 有一个静态的indicator数组 它是在MainFrm cpp文件中定义的 被MFC用作状态栏的定义 2 4 2状态栏 提示符从左到右水平排列在状态栏中 往数组中添加更多的标识符就可以在状态栏增加更多的提示符 可以根据需要动态改变提示符的大小 通过增加ID SEPARATOR元素还可增加分隔符 最左边的提示符 位置0 通常用作消息区 可以在其中显示命令提示之类的文本字符串 创建状态栏创建状态栏的步骤 1 构造CStatusBar对象 2 调用Create创建状态栏并将其与CStatusBar对象联结 3 调用成员函数SetIndicators 设置指示符的标识符为数组中相应元素指定的值 装载每个标识符指定的字符串资源并将字符串设为提示符文本 状态栏的创建 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if m wndStatusBar Create this m wndStatusBar SetIndicators indicators sizeof indicators sizeof UINT TRACE0 Failedtocreatestatusbar n return 1 failtocreate CStatusBarm wndStatusBar 3 自定义状态栏窗格 每个窗格指定一个ID号 同时还要创建一个相同ID号的字符串资源 窗格的初始大小等于关联字符串的长度 显示鼠标位置 插入窗格 staticUINTindicators ID SEPARATOR IDS MOUSEXY ID INDICATOR CAPS ID INDICATOR NUM ID INDICATOR SCRL 插入窗格的ID 显示鼠标位置 输出内容 映射WM MOUSEMOVE到视图类CStringstr CMainFrame pFrame CMainFrame AfxGetApp m pMainWnd CMFCStatusBar pStatus 将该成员修改为public修饰 CStatusBar Create 函数用于创建一个Windows状态栏 子窗口 并将其连接到CStatusBar对象上 同时设置初始字体和状态栏的高度 该函数原型为 BOOLCreate CWnd pParentWnd DWORDdwStyle WS CHILD WS VISIBLE CBRS BOTTOM UINTnID A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家暴广告策划方案(3篇)
- 租赁方案么(3篇)
- 污泥使用方案模板(3篇)
- 庙宇场所整治方案(3篇)
- 白酒散酒供货方案(3篇)
- 地铁机房整合方案(3篇)
- 电务道岔检修方案(3篇)
- 公司注销营销方案(3篇)
- 车位销售责任划分方案(3篇)
- 运输公司结算方案模板(3篇)
- 2025年人教版七年级数学下册期末测试卷
- 2025至2030年中国汽车轮毂轴承行业市场全景评估及发展趋势研判报告
- 人文英语4-005-国开机考复习资料
- 公司安全事故隐患内部举报、报告奖励制度
- 有趣的行为金融学知到章节答案智慧树2023年上海海洋大学
- 充电桩检测报告模板
- 车载诊断系统(OBD)简介课件
- 无犯罪证明委托书模板
- 城市轨道交通列车运行图编制课件
- 吊车施工专项施工方案
- (新版)国际法配套练习题库500题(含各题型)
评论
0/150
提交评论