




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、visual c+6.0可视化编程 1实例47 SDI应用程序框架建立一个SDI应用程序第一步选择Single document,其他取默认设置。2项目工作区类视图文件视图资源视图文件组成 StdAfx.h和StdAfx.cpp包含程序预编译的头文件Resource.h包含所有资源符号定义的标准头文件。 program47.rc包含资源描述信息的资源文件-图标、位图和光标等。 program47.rc2包含不能在集成开发环境中直接编辑的资源 program47.ico是应用程序的图标文件。 program47.bmp是包含工具栏按钮的位图文件,可以在集成环境中进行编辑。 Readme.txt是
2、应用程序描述文件,对AppWizard生成的原文件进行描述3用Developer Studio建立项目Developer Studio会创建很多中间文件 APS /支持ResourceViewBSC /浏览器信息文件CLW /支持ClassWizardDSP /项目文件,不能删除和用文本编辑器编辑DSW /工作空间文件,不能删除和用文本编辑器编辑MAK /外部的创建文件NCB /支持ClassView OPT /保存工作空间的配置PLG /建立日志文件4一。应用程序框架“应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。5应用
3、程序的体系结构基于框架窗口的应用程序基于对话框的应用程序基于文档/视图的应用程序6与基于框架窗口的程序框架有关的 MFC类结构CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject7CCmdTarget类CCmdTarget 是 MFC 消息映射结构的基类。消息映射将命令或消息发送给应用程序编写的处理命令或消息的响应函数。具有消息处理能力的类均应为该类的派生类。8CWinThread 类Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。9CWinApp类CWinA
4、pp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从CWinApp派生的类对象。10CWnd类CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。11CFrameWnd类提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。12基于框架窗口的应用程序结构的类关系CWinApp应用程序对象 m_pMainWndCFrameWnd应用程序框架窗口13程序执行过程初始化应用程序 初始化实例 创建窗口显示窗口进入消息循环结束应用程
5、序WinMain(入口)CHelloApp:InitInstanceCHelloWnd:CHelloWndCWnd:ShowWindowCWnd:UpdateWindowCWinApp:RunCWindApp:ExitInstanceCWnd:CreateCHelloApp:InitApplication14WinMain函数WinMain函数是应用程序的入口。用户不需要编写该函数代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。15CWinApp 对象CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 Init
6、Application和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。16InitInstance成员函数通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。NewShowWindowUpdateWindow17Run 及 ExitInstance成员函数初始化后,WinMain自动调用 Run,它主要负责执行消息循环。退出应用程序时,WinMain要调用ExitInstace成员函数。18主边框窗口CProgram47Frame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。
7、(程序处理举例) CProgram47Frame:OnLButtonDown函数:消息处理机制,当鼠标坐键被按下这一事件被映射到CProgram47Frame的OnLButtonDown函数上,进行消息处理。视图类 OnPaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;OnPrint()是当打印一页时被调用,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对OnDraw(CDC *pDC)的调用。19程序运行过程分析 CProgram47App类:CProgram47App类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。 CProgra
8、m47App theApp; 全局对象,在程序开始运行时,调用 CProgram47App类的构造函数生成。 WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。 应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。20CProgram47App:InitInstance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。CWinApp:Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责
9、传递应用程序的消息给相应的窗口。 (完成了windows API 中函数GetMessage(), TranslateMessage()和DispatchMessage()的功能。) OnIdle()是在Run()的空闲时间得到执行。当OnIdle()接收到消息后,转送到Run()进行处理。 ExitInstance()用于在程序运行实例终止时,进行相关资源的清理及释放。关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CProgram47Frame对象被删除,然后退出Run,进而退出WinMain,最后删除CProgram47App对象。 21程序的死亡: 使用者单击,于是发出WM-C
10、LOSE CMainWindow并没有设置WM-CLOSE处理程序,于是交给默认的处理程序,默认函数对于WM-CLOSE的处理方式是调用:DestroyWindow,并因而发出WM-DESTROY默认的WM-DESTROY处理方式是调用:PostQuitMessage,因此发出WM-QUIT.22CWinApp:Run收到WM-QUIT后会结束内部之消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数;如果CMyWinApp改写了ExitInstance,那么CWinApp:Run所调用的就是CMyWinApp:ExitInstance,否则就是CWinApp:Exit
11、Instance 最后回到AfxWinMain,执行AfxWinTerm,结束程序。23MFC应用程序编程体现了几个特性:封装 构成MFC框架的是MFC类库。MFC类库是C+类库。这些类封装了Win32应用程序编程接口、封装了应用程序的概念、封装了OLE特性、封装了ODBC和DAO数据访问的功能等等,分述如下。 24(1)对Win32应用程序编程接口的封装 用一个C+ Object来包装一个Windows Object。例如:CWnd是一个C+ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C+ window obj
12、ect的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。25(2)对应用程序概念的封装 使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口等等。这两个部分其实都有相当程度的不变性,MFC就是把有着相当固定行为的WinMain内部操作封装在CWinApp中;把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。也就是说,CWinApp代表Windows应用程序本体,CFrameWnd代表一个主框窗口。 26MFC把其他许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封
13、装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。27(3)对COM/OLE特性的封装 OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。 (4)对ODBC功能的封装 以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。282.继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中最重要的类是CObject和Cmd
14、Target。CObject是MFC的根类,绝大多数MFC类是其派生的。 包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。29CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CWinThre
15、ad;文档对象,基类是CDocument,等等。303.虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。31于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承
16、基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。324.MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。33这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的
17、构成将在下一节具体讨论。为了支持对应用程序概念的封装,MFC内部必须作大量的工作:例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。34框架利用消息映像机制将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息。二。MFC 的消息处理机制35消息映射的实现说明:在处理消息的窗口类中说明消息响应函数:消息响应函数原型D
18、ECLARE_MESSAGE_MAP( )实现:在实现程序中说明消息映射BEGIN_MESSAGE_MAP(派生类,基类) 各种消息映射宏END_MESSAGE_MAP( )36消息映射项和处理方法消息响应函数原型:afx_msg void ClassMethod( )消息映射宏:ON_MessageName(ID,ClassMethod)消息响应函数的搜索路径:自下而上,直到 CCmdTarget37 CProgram47App中的消息映射BEGIN_MESSAGE_MAP(CProgram47App, CWinApp)/AFX_MSG_MAP(CProgram47App)ON_COMMAN
19、D(ID_APP_ABOUT, OnAppAbout)/ ClassWizard将在此处添加/删除成员,用户不要编辑此处区域的代码/AFX_MSG_MAP/ Standard document commandsON_COMMAND(ID_, CWinApp:On)ON_COMMAND(ID_, CWinApp:On)/ Standard print setup commandON_COMMAND(ID_, CWinApp:On)END_MESSAGE_MAP()38类的消息可以被继承,如果CProgram47App找不到与消息相匹配的消息处理函数时,将转去基类CWinApp中寻找。如果在所有基
20、类中都找不到消息处理函数,则执行默认的消息处理函数。用户可以用ClassWizard添加用户需要的消息映射。但有时需要手工在此处加代码。39三。窗口输入消息处理输入消息分类鼠标消息:用户区与非用户区键盘消息:系统键消息与非系统键消息40鼠标输入消息afx_msg void OnMouse_ (UINT nFlags,Cpoint point)afx_msg void On_Button_ (UINT nFlags,CPoint point)nFlags:标识同时按下的虚拟键point:光标所在的位置41键盘输入消息afx_msg void On_(UINT nChar, UINT nRepCn
21、t,UINT nFlags)nChar:输入字符的ASCIInRepCnt:重复击键的次数nFlags:虚拟键码.42例子应用利用AppWizard创建应用程序43CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject主要负责初始化、运行和结束应用程序的执行。负责管理操作数据及显示,并接收用户的输入。结论:CFrameWnd派生类的负担过重。44文档、视窗框架结构主要思想:将原CFrameWnd派生类的任务分配给文档类(CDocument)和视窗类(CView)。文档类主要负责管理数据;视窗类主要负责显示文档内容,接收用户的输入。45文档、视窗框架涉及的
22、主要类文档类(CDocument)管理程序操作的数据视窗(CView)显示数据并接收用户的输入和编辑信息边框窗口(CFrameWnd)管理视窗46文档、视窗框架涉及的主要类文档模板(CSingleDocTemplate、CMultiDocTemplate)负责协调文档、视窗和边框窗口的工作。通常,一种特定的文档模板创建并管理已打开的同种类型的所有文档应用程序类(CWinApp)控制应用程序的开始运行、初始化和结束47AppWizard、ClassWizard和资源编辑器AppWizard:创建MFC应用程序ClassWizard:创建Windows消息和命令的处理函数创建类成员变量创建和管理类
23、资源编辑器:创建并编辑菜单 、对话框、定制控制框、加速键、位图、图标、光标、字符串和版本等资源48利用AppWizard编写程序的基本步骤1、利用AppWizard创建应用程序框架2、若需要增加类成员,利用ClassWizard添加3、若需要重载成员函数,利用ClassWizard添加相应的消息映射关系,并填写函数体4、若需要定义类,利用ClassWizard进行定义49一个简单的应用程序中的对象Application ObjectDocument TemplateDocumentToolbarStatus BarViewCFrameWnd50使用文档/视窗结构的意义将数据操作与数据显示分开,
24、可以简化工作量;一组数据可以同时以不同的形式显示在多个视窗中;类库提供了选择文件、打开文件和关闭文件的管理;支持打印预览功能51视窗类CObjectCCmdTargetCWndCViewCScrollViewCFormViewCEditViewCRecordView52视窗类中的OnDraw成员函数每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw函数。驱使程序调用OnDraw的两个途径:用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据;程序中调用Invalidate(或者InvalidateRect),通知Windows调用OnDraw函数53实例48 窗口输出文字与图形通过实例48 实现在已有框架上添加代码,在程序中显示文字与图形。程序实现在应用程序文档窗口中输出一行文字,并在窗口中心画一个圆。首先,建立一个SDI应用程序框架。54在CProgram48View:OnDraw()中添加代码void CProgram48View:OnDraw(CDC* pDC)CProgram48Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清新创意灵感简历模板
- 夫妻析产离婚协议二零二五年
- 个体公司股份转让合同二零二五年
- 二零二五高校学生实习协议书范例
- 公司入股合作协议书
- 组织设计与岗位管理
- 房屋租赁及居间服务合同范例二零二五年
- 百货业务知识培训课件
- 幼儿园案例分析题及答案
- 2024年辅导员考试常见问题分析及试题及答案
- 环保知识竞赛考试参考题库300题(含各题型)
- 基于AT89C51单片机的智能水表设计
- 五年级《他怎么了》作文600字5篇
- 精神疾病专科临床医疗质量控制与评价标准(试行)
- 预防高处坠落安全专项施工方案
- 【超星学习通】追寻幸福:中国伦理史视角(清华大学)章节答案
- 常见急危重症的快速识别要点与处理技巧演示课件
- 人教A版(2019)必修第二册高中数学《平面向量及其应用》单元教材教学分析
- 2021届高考作文写作指导:材料作文的拟题技巧 (课件29张)
- GB/Z 18620.1-2008圆柱齿轮检验实施规范第1部分:轮齿同侧齿面的检验
- GB/T 9754-2007色漆和清漆不含金属颜料的色漆漆膜的20°、60°和85°镜面光泽的测定
评论
0/150
提交评论