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

上传人:hy****d 文档编号:243022630 上传时间:2024-09-14 格式:PPT 页数:60 大小:96.50KB
返回 下载 相关 举报
visual+c++60可视化编程2_第1页
第1页 / 共60页
visual+c++60可视化编程2_第2页
第2页 / 共60页
visual+c++60可视化编程2_第3页
第3页 / 共60页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,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是应用程序描述文件,对AppWizard生成的原文件进行描述,3,用,Developer Studio,建立项目,Developer Studio,会创建很多中间文件,APS /,支持,ResourceViewBSC /,浏览器信息文件,CLW /,支持,ClassWizardDSP /,项目文件,不能删除和用文本编辑器编辑,DSW /,工作空间文件,不能删除和用文本编辑器编辑,MAK /,外部的创建文件,NCB /,支持,ClassView,OPT /,保存工作空间的配置,PLG /,建立日志文件,4,一。应用程序框架,“应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。,5,应用程序的体系结构,基于框架窗口的应用程序,基于对话框的应用程序,基于文档/视图的应用程序,6,与基于框架窗口的程序框架有关的 MFC类结构,CCmdTarget,CWinThread,CWinApp,CWnd,CFrameWnd,CObject,7,CCmdTarget类,CCmdTarget 是 MFC 消息映射,结构的基类。消息映射将命令或,消息发送给应用程序编写的处理,命令或消息的响应函数。具有消,息处理能力的类均应为该类的派,生类。,8,CWinThread 类,Microsoft,的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。,CWinThread,封装了操作系统的调度功能。,9,CWinApp类,CWinApp,封装了,Windows,应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从,CWinApp,派生的类对象。,10,CWnd类,CWnd,是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。,11,CFrameWnd类,提供了一个,Windows,单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。,12,基于框架窗口的应用程序结构的类关系,CWinApp,应用程序对象,m_,pMainWnd,CFrameWnd,应用程序框架窗口,13,程序执行过程,初始化应用程序,初始化实例,创建窗口,显示窗口,进入消息循环,结束应用程序,WinMain(,入口),CHelloApp:InitInstance,CHelloWnd:CHelloWnd,CWnd:ShowWindow,CWnd:UpdateWindow,CWinApp:Run,CWindApp:ExitInstance,CWnd:Create,CHelloApp:InitApplication,14,WinMain,函数,WinMain,函数是应用程序的入口,。,用户不需要编写该函数代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,,,Windows,自动调用该函数,。,15,CWinApp 对象,CWinApp,的派生类对象要作为全程量定义,。,WinMain,函数将会调用,InitApplication,和,InitInstance,成员函数。注意:,InitInstance,是必须覆盖的成员函数,。,16,InitInstance,成员函数,通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。,New,ShowWindow,UpdateWindow,17,Run 及 ExitInstance成员函数,初始化,后,,WinMain,自动调用,Run,,它主要负责执行消息循环。,退出应用程序时,,WinMain,要调用,ExitInstace,成员函数。,18,主边框窗口,CProgram47Frame,类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类,CFrameWnd,的,Create,函数创建具体的窗口结构。,(程序处理举例),CProgram47Frame:OnLButtonDown,函数:消息处理机制,当鼠标坐键被按下这一事件被映射到,C,Program47,Frame,的,OnLButtonDown,函数上,进行消息处理。,视图类,OnPaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;,OnPrint()是当打印一页时被调用,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对OnDraw(CDC *pDC)的调用。,19,程序运行过程分析, CProgram47App,类:,C,Program47,App,类的对象代表一个应用程序,,CWinApp,基类决定它的大部分行为。,C,Program47App theApp;,全局对象,在程序开始运行时,调用,C,Program47App类的构造函数生成。, WinMain,函数:并非不存在只是已经被隐藏在应用程序框架内部。,应用程序的启动:当开始运行应用程序时,WINDOWS,会调用,WinMain,函数,,WinMain,会查找该应用程序的全局对象,theApp,。,20,C,Program47,App:InitInstance,成员函数:发现,theApp,后自动调用重载的虚函数,InitInstance,来完成主窗口的构造和显示工作。记住这个函数。,CWinApp:Run,成员函数:,WinMain,在调用,InitInstance,之后紧接着调用,Run,函数,它被隐藏在基类中负责传递应用程序的消息给相应的窗口。,(完成了windows API 中函数GetMessage(), TranslateMessage()和DispatchMessage()的功能。),OnIdle()是在Run()的空闲时间得到执行。当OnIdle()接收到消息后,转送到Run()进行处理。,ExitInstance()用于在程序运行实例终止时,进行相关资源的清理及释放。,关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先,C,Program47,Frame,对象被删除,然后退出,Run,,进而退出,WinMain,,最后删除,C,Program47,App,对象。,21,程序的死亡:,使用者单击,于是发出,WM-CLOSE,CMainWindow,并没有设置,WM-CLOSE,处理程序,于是交给默认的处理程序,默认函数对于,WM-CLOSE,的处理方式是调用:,DestroyWindow,,,并因而发出,WM-DESTROY,默认的,WM-DESTROY,处理方式是调用:,PostQuitMessage,,因此发出,WM-QUIT.,22,CWinApp:Run,收到,WM-QUIT,后会结束内部之消息循环,然后调用,ExitInstance,,这是,CWinApp,的一个虚拟函数;如果,CMyWinApp,改写了,ExitInstance,,那么,CWinApp:Run,所调用的就是,CMyWinApp,:,ExitInstance,,否则就是,CWinApp,:,ExitInstance,最后回到,AfxWinMain,,执行,AfxWinTerm,,结束程序。,23,MFC应用程序编程体现了几个特性:,封装,构成,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 object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。,25,(2)对应用程序概念的封装,使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口等等。,这两个部分其实都有相当程度的不变性,,,MFC就是把有着相当固定行为的WinMain内部操作封装在CWinApp中;把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。也就是说,CWinApp代表Windows应用程序本体,CFrameWnd代表一个主框窗口。,26,MFC把其他许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。,27,(3)对COM/OLE特性的封装,OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。,(4)对ODBC功能的封装,以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。,28,2.继承,首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中最重要的类是CObject和CmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的。,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。,29,CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。,MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。,这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CWinThread;文档对象,基类是CDocument,等等。,30,3.虚拟函数和动态约束,MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。,例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。,31,于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。,这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。,程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。,MFC编程框架将在适当的时候、适当的地方来调用程序的代码。,32,4.MFC的宏观框架体系,如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。,这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。,例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。,33,这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。,为了支持对应用程序概念的封装,MFC内部必须作大量的工作:例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。,又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。,虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。,34,框架利用消息映像机制将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息。,二。MFC 的消息处理机制,35,消息映射的实现,说明:在处理消息的窗口类中说明消息响应函数:,消息响应函数原型,DECLARE_MESSAGE_MAP( ),实现:在实现程序中说明消息映射,BEGIN_MESSAGE_MAP(,派生类,基类,), 各种消息映射宏,END_MESSAGE_MAP( ),36,消息映射项和处理方法,消息响应函数原型:,afx_msg void ClassMethod( ),消息映射宏:,ON_MessageName(ID,ClassMethod),消息响应函数的搜索路径:,自下而上,直到 CCmdTarget,37,CProgram47App中的消息映射,BEGIN_MESSAGE_MAP(CProgram47App, CWinApp),/AFX_MSG_MAP(CProgram47App),ON_COMMAND(ID_APP_ABOUT, OnAppAbout),/ ClassWizard将在此处添加/删除成员,用户不要编辑此处区域的代码,/AFX_MSG_MAP,/ Standard document commands,ON_COMMAND(ID_, CWinApp:On),ON_COMMAND(ID_, CWinApp:On),/ Standard print setup command,ON_COMMAND(ID_, CWinApp:On),END_MESSAGE_MAP(),38,类的消息可以被继承,如果,CProgram47App找不到与消息相匹配的消息处理函数时,将转去基类CWinApp中寻找。,如果在所有基类中都找不到消息处理函数,则执行默认的消息处理函数。,用户可以用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 nRepCnt,UINT nFlags),nChar:输入字符的ASCII,nRepCnt:重复击键的次数,nFlags:,虚拟键码.,42,例子应用,利用AppWizard创建应用程序,43,CCmdTarget,CWinThread,CWinApp,CWnd,CFrameWnd,CObject,主要负责初始化、运行和结束应用程序的执行。,负责管理操作数据及显示,并接收用户的输入。,结论:,CFrameWnd派生类,的负担过重,。,44,文档、视窗框架结构,主要思想:将原,CFrameWnd,派生类的任务分配给文档类(,CDocument,),和视,窗类(,CView,)。,文档类主要负责管理数据;视窗类主要负责显示文档内容,接收用户的输入。,45,文档、视窗框架涉及的主要类,文档类(,CDocument,),管理程序操作的数据,视窗(,CView,),显示数据并接收用户的输入和编辑信息,边框窗口(,CFrameWnd,),管理视窗,46,文档、视窗框架涉及的主要类,文档模板(,CSingleDocTemplate,、,CMultiDocTemplate,),负责协调文档、视窗和边框窗口的工作。通常,一种特定的文档模板创建并管理已打开的同种类型的所有文档,应用程序类(,CWinApp,),控制应用程序的开始运行、初始化和结束,47,AppWizard、ClassWizard和资源编辑器,AppWizard:创建MFC应用程序,ClassWizard:,创建Windows消息和命令的处理函数,创建类成员变量,创建和管理类,资源编辑器:创建并编辑菜单 、对话框、定制控制框、加速键、位图、图标、光标、字符串和版本等资源,48,利用,AppWizard编写程序的基本步骤,1、利用AppWizard创建应用程序框架,2、若需要增加类成员,利用ClassWizard添加,3、若需要重载成员函数,利用ClassWizard添加相应的消息映射关系,并填写函数体,4、若需要定义类,利用ClassWizard进行定义,49,一个简单的应用程序中的对象,Application Object,Document Template,Document,Toolbar,Status Bar,View,CFrameWnd,50,使用文档/视窗结构的意义,将数据操作与数据显示分开,可以简化工作量;,一组数据可以同时以不同的形式显示在多个视窗中;,类库提供了选择文件、打开文件和关闭文件的管理;,支持打印预览功能,51,视窗类,CObject,CCmdTarget,CWnd,CView,CScrollView,CFormView,CEditView,CRecordView,52,视窗类中的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 data here,/以下为新增的代码,CRect r;/定义CRect类对象r,GetClientRect(/获取客户区窗口坐标范围,窗口的客户区是指窗口中除边框、标题栏、菜单栏等以外的区域。,55,int x=0,y=0;,/定义坐标变量,并设置初始值,pDC-TextOut(x,y,“在窗口上画一个圆形”); /输出字符串,pDC是指向一个CDC(设备上下文)对象的指针, CDC对象在这里就是指当前文凼窗口。,x=r.right/2;,/更改坐标为窗口中心位置,y=r.bottom/2;,pDC-Ellipse(x-100,y-100,x+100,y+100); /画圆,56,实例49 添加新的消息映射,建立一个SDI的MFC工程。 ON_WM_CREATE()默认已建立。,用VIEW-ClassWizard为主框架类添加WM_CLOSE消息映射。,在MainFrm.cpp文件中新增的映射宏,ON_WM_CLOSE(),在MainFrm.h文件中新增的消息处理函数的声明afx_msg void OnClose();,57,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),/添加下面这一行语句,显示对话框,MessageBox(准备建立应用程序,创建程序,MB_OK|MB_ICONEXCLAMATION);,if (CFrameWnd:OnCreate(lpCreateStruct) = -1),return -1;,58,void CMainFrame:OnClose(),/ TODO: Add your message handler code here and/or call default,MessageBox(准备销毁程序窗口,撤消窗口,MB_OK|MB_ICONEXCLAMATION);,CFrameWnd:OnClose();,59,看实例50-实例54,学习各种消息映射。,(附主要代码),60,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!