visual+c++6.0可视化编程2

上传人:野鹰 文档编号:3192186 上传时间:2017-07-31 格式:PPT 页数:60 大小:184KB
返回 下载 相关 举报
visual+c++6.0可视化编程2_第1页
第1页 / 共60页
visual+c++6.0可视化编程2_第2页
第2页 / 共60页
visual+c++6.0可视化编程2_第3页
第3页 / 共60页
visual+c++6.0可视化编程2_第4页
第4页 / 共60页
visual+c++6.0可视化编程2_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《visual+c++6.0可视化编程2》由会员分享,可在线阅读,更多相关《visual+c++6.0可视化编程2(60页珍藏版)》请在金锄头文库上搜索。

1、,visual c+6.0可视化编程,实例47 SDI应用程序框架,建立一个SDI应用程序第一步选择Single document,其他取默认设置。,项目工作区类视图文件视图资源视图文件组成 StdAfx.h和StdAfx.cpp包含程序预编译的头文件Resource.h包含所有资源符号定义的标准头文件。 program47.rc包含资源描述信息的资源文件-图标、位图和光标等。 program47.rc2包含不能在集成开发环境中直接编辑的资源 program47.ico是应用程序的图标文件。 program47.bmp是包含工具栏按钮的位图文件,可以在集成环境中进行编辑。 Readme.txt

2、是应用程序描述文件,对AppWizard生成的原文件进行描述,用Developer Studio建立项目Developer Studio会创建很多中间文件,APS /支持ResourceViewBSC /浏览器信息文件CLW /支持ClassWizardDSP /项目文件,不能删除和用文本编辑器编辑DSW /工作空间文件,不能删除和用文本编辑器编辑MAK /外部的创建文件NCB /支持ClassView OPT /保存工作空间的配置PLG /建立日志文件,一。应用程序框架,“应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。,

3、应用程序的体系结构,基于框架窗口的应用程序基于对话框的应用程序基于文档/视图的应用程序,与基于框架窗口的程序框架有关的 MFC类结构,CCmdTarget类,CCmdTarget 是 MFC 消息映射结构的基类。消息映射将命令或消息发送给应用程序编写的处理命令或消息的响应函数。具有消息处理能力的类均应为该类的派生类。,CWinThread 类,Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。,CWinApp类,CWinApp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建

4、立的应用程序必须有一个且只有一个从CWinApp派生的类对象。,CWnd类,CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。,CFrameWnd类,提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。,基于框架窗口的应用程序结构的类关系,CWinApp应用程序对象 m_pMainWnd,CFrameWnd应用程序框架窗口,程序执行过程,初始化应用程序 初始化实例 创建窗口显示窗口进入消息循环结束应用程序,WinMain函数,WinMain函数是应用程序的入口。用户不需要编写该函数

5、代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。,CWinApp 对象,CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 InitApplication和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。,InitInstance成员函数,通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。,NewShowWindowUpdateWindow,Run 及 ExitInstance成员函数,初始化后,WinMain自动调用 Run,它主要负责执行消息循环。退出应用

6、程序时,WinMain要调用ExitInstace成员函数。,主边框窗口CProgram47Frame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。(程序处理举例) CProgram47Frame:OnLButtonDown函数:消息处理机制,当鼠标坐键被按下这一事件被映射到CProgram47Frame的OnLButtonDown函数上,进行消息处理。视图类 OnPaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;OnPrint()是当打印一页时被调用,负责完成向某页打印纸上打印。这两个函数的

7、缺省实现中包含了对OnDraw(CDC *pDC)的调用。,程序运行过程分析, CProgram47App类:CProgram47App类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。 CProgram47App theApp; 全局对象,在程序开始运行时,调用 CProgram47App类的构造函数生成。 WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。 应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。,CProgram47App:InitInstance成员函数:发现theAp

8、p后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。CWinApp:Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相应的窗口。 (完成了windows API 中函数GetMessage(), TranslateMessage()和DispatchMessage()的功能。) OnIdle()是在Run()的空闲时间得到执行。当OnIdle()接收到消息后,转送到Run()进行处理。 ExitInstance()用于在程序运行实例终止时,进行相关资源的清理及释放。关闭应用程序

9、:用户关闭应用程序时会有一系列事件发生。首先CProgram47Frame对象被删除,然后退出Run,进而退出WinMain,最后删除CProgram47App对象。,程序的死亡:,使用者单击File/Close,于是发出WM-CLOSE CMainWindow并没有设置WM-CLOSE处理程序,于是交给默认的处理程序,默认函数对于WM-CLOSE的处理方式是调用:DestroyWindow,并因而发出WM-DESTROY默认的WM-DESTROY处理方式是调用:PostQuitMessage,因此发出WM-QUIT.,CWinApp:Run收到WM-QUIT后会结束内部之消息循环,然后调用E

10、xitInstance,这是CWinApp的一个虚拟函数;如果CMyWinApp改写了ExitInstance,那么CWinApp:Run所调用的就是CMyWinApp:ExitInstance,否则就是CWinApp:ExitInstance 最后回到AfxWinMain,执行AfxWinTerm,结束程序。,MFC应用程序编程体现了几个特性:封装 构成MFC框架的是MFC类库。MFC类库是C+类库。这些类封装了Win32应用程序编程接口、封装了应用程序的概念、封装了OLE特性、封装了ODBC和DAO数据访问的功能等等,分述如下。,(1)对Win32应用程序编程接口的封装 用一个C+ Obj

11、ect来包装一个Windows Object。例如:CWnd是一个C+ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C+ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。,(2)对应用程序概念的封装 使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口等等。这两个部分其实都有相当程度的不变性,MFC就是把有着相当固定行为的WinMain内部操作封装在CWinApp中;把有着相当固定行为的WndProc内部操作封装在CFrameWnd

12、中。也就是说,CWinApp代表Windows应用程序本体,CFrameWnd代表一个主框窗口。,MFC把其他许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。,(3)对COM/OLE特性的封装 OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。 (4)对ODBC功能的封装 以少量的能提供与ODBC之间更

13、高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。,2.继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中最重要的类是CObject和CmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的。 包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。,CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdT

14、arget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CWinThread;文档对象,基类是CDocument,等等。,3.虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚

15、拟函数,由于数量太多,实现起来不现实。,于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。,4.MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用

16、程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。,这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。为了支持对应用程序概念的封装,MFC内部必须作大量的工作:例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号