收藏 分享(赏)

C++程序架构.doc

上传人:hyngb9260 文档编号:5956997 上传时间:2019-03-22 格式:DOC 页数:17 大小:457.50KB
下载 相关 举报
C++程序架构.doc_第1页
第1页 / 共17页
C++程序架构.doc_第2页
第2页 / 共17页
C++程序架构.doc_第3页
第3页 / 共17页
C++程序架构.doc_第4页
第4页 / 共17页
C++程序架构.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、C+程序架构目 录一、 引言二、 C+程序架构的基本元素 - 类三、 C+程序开发过程四、 MFC 知识介绍(1)MFC 是一个编程框架(2)MFC 的宏观框架体系(3)MFC 对象的创建过程3.1 创建关系3.2 创建程序步骤3.3 常用的类的层次3.4MFC 运行层次结构图3.5WinMain 入口函数五、MFC 程序流程一、引言应用程序也像一个建筑物,有它的架构, 建筑物是有层次,模块, 和基本元素, 如砖块,或模版组成的。程序也非常相似,类就是 C+程序架构的基本元素。程序是运行在计算机上的, 而计算机必须有一个操作系统,我们把操作系统看作是一个平台, 程序就是运行在这个平台上, 就像

2、建筑物总是起在一定的基础上一样。操作系统提供了许多程序编程接口,API 。 应用程序通过 API 调用操作系统许多内置的功能。二、C+程序架构的基本元素 - 类C+程序是由一个一个类组成的,每一个类它可能是基类或者派生类,每一个类都封装了程序接口或者应用程序的概念等等,都有相应的功能和作用。通过类的继承,可以使用基类的特性,或者派生出其他的特性。使用虚拟函数和消息机制提供丰富的编程接口和控制。一个程序的入口点是其主函数,主函数的主要任务是完成一些初始化的工作和维护一个消息循环。通过主函数进入程序入口(如果编写的是基于 Windows 系统的程序,程序中将 WinMain()函数作为应用程序的入

3、口),根据主函数要求初始化窗口,发送消息调用其他的类,而类里封装着小程序或者低级的系统应用程序,然后完成类里的程序运行,这个过程也是对消息循环的维护。当按照发送消息的要求完成每一个类的调用,也就完成了一个程序。C+程序启动和初始化过程是创建对象、建立各种对象之间的关系、把窗口显示在屏幕上的过程。而退出程序是关闭窗体销毁对象的过程。如果程序是 MFC 的Windows 应用程序,程序使用 WinMain()函数作为入口,这个函数已经通过封装隐藏与应用程序框架中。除 WinMain()外,类似于 CWinApp 类成员函数Run()也是隐含执行的,Run()函数负责把消息放进应用程序窗口消息循环中

4、,由 WinMain()函数完成对 Run 的调用。当 WinMain()函数寻找到应用程序对象后立即调用 CWinApp 类的虚函数 InitInstance()进行重载,以知道究竟需要何种窗体框架。然后调用注册窗口类,进而调用 LoadFrame()函数载入框架,使用派生类:Create()创建应用程序框架,接着创建程序窗口。使用显示更新函数显示更新程序窗口。C+的类的调用过程也就是它的工作流程,也可以理解为类的消息循环,也就构成程序的框架。而这种消息的传送也就符合 Windows 应用程序的特点,消息驱动。如果我们要与程序交互的话,需要做的仅仅是选择适当的时机上系统产生消息了。C+ 的模

5、块和元素的运行法则 事件驱动。C+的模块和元素之间的通讯 消息机制。 Windows 消息机制三、C+程序开发过程根据问题建立模型,编写.h 头文件、项目配置文件、.cpp 源文件,然后预编译、编译,链接库文件,最后生成可执行程序。链接过程是将.obj 目标代码和.lib函数库、类库合理有机组成.exe 执行文件。(如下图)四、MFC 知识介绍以 MFC 为例子,简单谈下自己对它的一些了解:(1)MFC 是一个编程框架 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立 Windows

6、下的应用程序,这是一种相对 SDK 来说更为简单的方法。因为总体上,MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard 可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑;(2)MFC 的宏观框架体系 MFC 实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这

7、样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI 应用程序的模板,MDI 应用程序的模板,规则 DLL 应用程序的模板,扩展 DLL 应用程序的模板,OLE/ACTIVEX 应用程序的模板,等等。这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的 MDI 应用程序的构成将在下一节具体讨论。为了支持对应用程序概念的封装,MFC 内部必须作大量的工作。例如,为了实现消息映射机制,MFC 编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对 DLL 编程的支持和多线程编程的支持,MFC 内

8、部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解 MFC 内部机制有助于写出功能灵活而强大的程序。总之,MFC 封装了 Win32 API,OLE API,ODBC API 等底层函数的功能,并提供更高一层的接口,简化了 Windows 编程。同时,MFC 支持对底层 API 的直接调用。MFC 提供了一个 Windows 应用程序开发模式,对程序的控制主要是由 MFC 框架完成的,而且 MFC 也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的

9、代码来处理应用程序特定的事件。MFC 是 C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是 C+对继承的支持,对虚拟函数的支持,以及 MFC 实现的消息映射机制。(3)MFC 对象的创建过程 MFC 程序启动和初始化过程就是创建 MFC 对象和 Windows 对象、建立各种对象之间的关系、把窗口显示在屏幕上的过程,退出过程就是关闭窗口、销毁所创建的 Windows 对象和 MFC 对象的过程。所以,下面要讨论几种常用 MFC 对象的结构,它们是构成一个文档-视模式应用程序的重要

10、部件。(3.1)创建关系(3.2)创建程序步骤1)SDI 应用程序的对象创建 程序从 InitInstance 开始,在 SDI 应用程序的 InitInstance 里,至少有以下部分:第一部分,创建文档模板对象并把它添加到应用程序的模板链表第二部分,动态创建文档、视、边框窗口等 MFC 对象和对应的 Windows 对象;(1)、 文档模板的创建 (2)、 文件的创建或者打开在创建工作完成之后,进行初始化,使用文档对象的数据来更新视和显示窗口。至此,本节描述了 MFC的 SDI 程序从分析命令行到创建或打开文件的处理过程,文档对象已经动态创建。总结如下:命令行分析应用程序的 FileNew

11、文档模板的 OpenDocumentFile(NULL)文档的 OnNewDocument命令行分析应用程序的 FileOPen 文档模板 OpenDocumentFile(filename)文档的 OpenDocument第三部分,返回 TRUE,WinMain 下一步调用 Run 开始消息循环,否则,终止程序;2)视的创建3)窗口初始化4)视的初始化5)激活边框窗口(处理 WM_ACTIVE)(3.3)常用的类的层次关系-参考MFC 教程中 MFC 概述http:/ 运行层次结构图(3.5)WinMain 入口函数 现在讨论 MFC 应用程序如何启动。WinMain 函数是 MFC 提供的

12、应用程序入口。进入 WinMain 前,全局应用程序对象已经生成。WinMain 流程如下图。图中,灰色框是对被调用的虚拟函数的注释,程序员可以或必须覆盖它以实现 MFC 要求的或用户希望的功能;大括号所包含的图示是相应函数流程的细化,有应用程序对象 App 的初始化、Run 函数的实现、PumpMessage 的流程,等等。图出自MFC 教程第五章 MFC 对象的创建http:/ 来说,InitInstance 在应用程序初始化时调用,ExitInstance在程序退出时调用,Run 在程序初始化之后调用导致程序进入消息循环,ProcessMessageFilter、OnIdle、PreTr

13、anslateMessage 在消息循环时被调用,分别用来过滤消息、进行 Idle 处理、让窗口预处理消息。(2)应用程序对象的角色首先,应用程序对象的成员函数 InitInstance 被 WinMain 调用。对程序员来说,它就是程序的入口点(真正的入口点是 WinMain,但 MFC 向程序员隐藏了WinMain 的存在)。由于 MFC 没有提供 InitInstance 的缺省实现,用户必须自己实现它。稍后将讨论该函数的实现。其次,通过应用程序对象的 Run 函数,程序进入消息循环。实际上,消息循环的实现是通过 CWinThread:Run 来实现的,图中所示的是 CWinThread

14、:Run 的实现,因为 CWinApp 没有覆盖 Run 的实现,程序员的应用程序类一般也不用覆盖该函数。(3)Run 所实现的消息循环它调用 PumpMessage 来实现消息循环,如果没消息,则进行空闲(Idle)处理。如果是 WM_QUIT 消息,则调用 ExitInstance 后退出消息循环。(4)CWinThread:PumpMessage该函数在 MFC 函数文档里没有描述,但是 MFC 建议用户使用。它实现获取消息,转换(Translate)消息,发送消息的消息循环。在转换消息之前,调用虚拟函数PreTranslateMessage 对消息进行预处理,该函数得到消息目的窗口对象

15、之后,使用 CWnd 的 WalkPreTranslateTree 让目的窗口及其所有父窗口得到一个预处理当前消息的机会。关于消息预处理,见消息映射的有关章节。如果是WM_QUIT 消息,PumpMessage 返回 FALSE;否则返回 TRUE。五、MFC 程序流程1: application object 产生2:AfxWinMain 执行 AfxWininit,调用 AfxinitThred3:AfxWinMain 执行 InitApplication,Initinstance(是 Cwinapp 虚函数)4:CMyWinApp:InitInstance new 一个 CMyFrame

16、Wnd5:CMyFrameWnd 构造函数调用 Create 产生主窗口6:InitInstance 执行 ShowWindow,UpdateWindow,发出 WM_PAINT7:AfxWinMain 执行 run 8:GetMessage,WM_PAINT 由: DispatchMessage 送 CWnd:DefWindowProcMessageMap9:调用对应函数(BEGIN MESSAGEMAP,END_MESSAGE_MAP 建立的)10:单击 file/close,则发出 WMCLOSE11:CMyFrameWnd 交默认处理12:调用:DestroyWindow 发出 WM_DESTROY13:默认处理调用:postQuitMessage 发出 WM_QUIT14:CWinapp:Run 收到 WMQUIT 结束内部循环,调用 ExitInsance(若 CMyWinApp 改写 Exitinstance,则调用 CMyWinApp:ExitInstance;15:回到 AfxWinMain,执行 AfxWinTerm,程序结束!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报