《visual+c++6.0可视化编程2.ppt》由会员分享,可在线阅读,更多相关《visual+c++6.0可视化编程2.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、visual c+6.0可视化编程可视化编程 实例47 SDI应用程序框架n建立一个SDI应用程序n第一步选择Single document,其他取默认设置。n项目工作区n类视图n文件视图n资源视图n文件组成n StdAfx.h和StdAfx.cpp包含程序预编译的头文件nResource.h包含所有资源符号定义的标准头文件。n program47.rc包含资源描述信息的资源文件-图标、位图和光标等。n program47.rc2包含不能在集成开发环境中直接编辑的资源n program47.ico是应用程序的图标文件。n program47.bmp是包含工具栏按钮的位图文件,可以在集成环境中进
2、行编辑。n Readme.txt是应用程序描述文件,对AppWizard生成的原文件进行描述用Developer Studio建立项目Developer Studio会创建很多中间文件 APS/支持ResourceViewBSC/浏览器信息文件CLW/支持ClassWizardDSP/项目文件,不能删除和用文本编辑器编辑DSW/工作空间文件,不能删除和用文本编辑器编辑MAK/外部的创建文件NCB/支持ClassView OPT/保存工作空间的配置PLG/建立日志文件一。应用程序框架n“应用程序框架”定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展
3、开的。应用程序的体系结构基于框架窗口的应用程序基于对话框的应用程序基于文档/视图的应用程序与基于框架窗口的程序框架有关的 MFC类结构CCmdTargetCWinThreadCWinAppCWndCFrameWndCObjectCCmdTarget类CCmdTarget 是 MFC 消息映射结构的基类。消息映射将命令或消息发送给应用程序编写的处理命令或消息的响应函数。具有消息处理能力的类均应为该类的派生类。CWinThread 类 Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。CWinApp类 CW
4、inApp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从CWinApp派生的类对象。CWnd类 CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。CFrameWnd类 提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。基于框架窗口的应用程序结构的类关系CWinApp应用程序对象应用程序对象 m_pMainWndCFrameWnd应用程序框架窗口应用程序框架窗口程序执行过程初始化应用程序初始化应用程序初始化应用程序初
5、始化应用程序 初始化实例初始化实例初始化实例初始化实例 创建窗口创建窗口创建窗口创建窗口显示窗口显示窗口显示窗口显示窗口进入消息循环进入消息循环进入消息循环进入消息循环结束应用程序结束应用程序结束应用程序结束应用程序WinMain(入口入口)CHelloApp:InitInstanceCHelloWnd:CHelloWndCWnd:ShowWindowCWnd:UpdateWindowCWinApp:RunCWindApp:ExitInstanceCWnd:CreateCHelloApp:InitApplicationWinMain函数 WinMain函数是应用程序的入口。用户不需要编写该函数
6、代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。CWinApp 对象 CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 InitApplication和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。InitInstance成员函数 通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。NewShowWindowUpdateWindowRun 及 ExitInstance成员函数n n初始化后,WinMain自动调用 Run,它主要负责执行消息循环。n n退出应
7、用程序时,WinMain要调用ExitInstace成员函数。n主边框窗口主边框窗口nCProgram47Frame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。n(程序处理举例)(程序处理举例)CProgram47Frame:OnLButtonDown函数:消息处理机制,当鼠标坐键被按下这一事件被映射到CProgram47Frame的OnLButtonDown函数上,进行消息处理。n视图类视图类 nOnPaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;nOnPrint()是当打印一页时被调用
8、,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对OnDraw(CDC*pDC)的调用。程序运行过程分析 CProgram47App类:CProgram47App类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。CProgram47App theApp;全局对象,在程序开始运行时,调用 CProgram47App类的构造函数生成。n WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。n应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。nCProgram47App:InitIns
9、tance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。nCWinApp:Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相应的窗口。(完成了windows API 中函数GetMessage(),TranslateMessage()和DispatchMessage()的功能。)OnIdle()是在Run()的空闲时间得到执行。当OnIdle()接收到消息后,转送到Run()进行处理。ExitInstance()用于在程序运行实例终止时,进行相关资
10、源的清理及释放。n关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CProgram47Frame对象被删除,然后退出Run,进而退出WinMain,最后删除CProgram47App对象。程序的死亡:程序的死亡:使用者单击File/Close,于是发出WM-CLOSE CMainWindow并没有设置WM-CLOSE处理程序,于是交给默认的处理程序,默认函数对于WM-CLOSE的处理方式是调用:DestroyWindow,并因而发出WM-DESTROY默认的WM-DESTROY处理方式是调用:PostQuitMessage,因此发出WM-QUIT.CWinApp:Run收到WM-QUI
11、T后会结束内部之消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数;如果CMyWinApp改写了ExitInstance,那么CWinApp:Run所调用的就是CMyWinApp:ExitInstance,否则就是CWinApp:ExitInstance 最后回到AfxWinMain,执行AfxWinTerm,结束程序。MFCMFC应用程序编程体现了几个特性:应用程序编程体现了几个特性:封装封装 构成MFC框架的是MFC类库。MFC类库是C+类库。这些类封装了Win32应用程序编程接口、封装了应用程序的概念、封装了OLE特性、封装了ODBC和DAO数据访问的功能等等,
12、分述如下。(1)对Win32应用程序编程接口的封装 用一个C+Object来包装一个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中;把有
13、着相当固定行为的WndProc内部操作封装在CFrameWnd中。也就是说,CWinApp代表Windows应用程序本体,CFrameWnd代表一个主框窗口。MFC把其他许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。(3)对COM/OLE特性的封装 OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。(
14、4)对ODBC功能的封装 以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。2.继承继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中最重要的类是CObject和CmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的。包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处
15、理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CWinThread;文档对象,基类是CDocument,等等。3.虚拟函数和动态约束虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消
16、息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。4.MFC的宏观框架体系的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对
17、不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。为了支持对应用程序概念的封装,MFC内部必须作大量的工作:例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对
18、程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。框架利用消息映像机制将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息。二。MFC 的消息处理机制消息映射的实现uu说明:在处理消息的窗口类中说明消息响应函数:消息响应函数原型消息响应函数原型消息响应函数原型消息响应函数原型DECLARE_MESSAGE_MAP()DECLARE_MESSAGE_MAP()uu实现:在实现程序中说明消息映射BEGIN_MESSAGE_MAP(BEGIN_MESSAGE_MAP(派生类,基类派生类,基类派生类,基类派生类,基类)各种消息映射宏各种消息映射宏各种消息映射
19、宏各种消息映射宏END_MESSAGE_MAP()END_MESSAGE_MAP()消息映射项和处理方法n n消息响应函数原型:afxafx_ _msg msg voidvoid ClassMethod ClassMethod()()n n消息映射宏:ON_ON_MessageNameMessageName(ID,(ID,ClassMethodClassMethod)消息响应函数的搜索路径:自下而上,直到 CCmdTarget CProgram47App中的消息映射nBEGIN_MESSAGE_MAP(CProgram47App,CWinApp)n/AFX_MSG_MAP(CProgram47
20、App)nON_COMMAND(ID_APP_ABOUT,OnAppAbout)n/ClassWizard将在此处添加/删除成员,用户不要编辑此处区域的代码n/AFX_MSG_MAPn/Standard file based document commandsnON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)nON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)n/Standard print setup commandnON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSet
21、up)nEND_MESSAGE_MAP()n类的消息可以被继承,如果CProgram47App找不到与消息相匹配的消息处理函数时,将转去基类CWinApp中寻找。n如果在所有基类中都找不到消息处理函数,则执行默认的消息处理函数。n用户可以用ClassWizard添加用户需要的消息映射。但有时需要手工在此处加代码。三。窗口输入消息处理输入消息分类n n鼠标消息:用户区与非用户区用户区与非用户区n n键盘消息:系统键消息与非系统键消息系统键消息与非系统键消息鼠标输入消息afx_msg void OnMouse_ (UINT nFlags,Cpoint point)afx_msg void On_B
22、utton_ (UINT nFlags,CPoint point)nFlagsnFlags:标识同时按下的虚拟键标识同时按下的虚拟键point:point:光标所在的位置光标所在的位置键盘输入消息afx_msg void On_(UINT nChar,UINT nRepCnt,UINT nFlags)nCharnChar:输入字符的输入字符的ASCIIASCIInRepCntnRepCnt:重复击键的次数重复击键的次数nFlagsnFlags:虚拟键码虚拟键码.例子应用例子应用利用利用AppWizard创创建应用程序建应用程序CCmdTargetCWinThreadCWinAppCWndCFr
23、ameWndCObject主要负责初始化、运行和结束应用程序的执行。负责管理操作数据及显示,并接收用户的输入。结论:CFrameWnd派生类的负担过重。文档、视窗框架结构 主要思想:将原CFrameWnd派生类的任务分配给文档类(CDocument)和视窗类(CView)。文档类主要负责管理数据;视窗类主要负责显示文档内容,接收用户的输入。文档、视窗框架涉及的主要类q文档类(CDocument)管理程序操作的数据管理程序操作的数据q视窗(CView)显示数据并接收用户的输入和编辑信息显示数据并接收用户的输入和编辑信息q边框窗口(CFrameWnd)管理视窗管理视窗文档、视窗框架涉及的主要类q文
24、档模板(CSingleDocTemplate、CMultiDocTemplate)负责协调文档、视窗和边框窗口的工作。通常,一种负责协调文档、视窗和边框窗口的工作。通常,一种特定的文档模板创建并管理已打开的同种类型的所有特定的文档模板创建并管理已打开的同种类型的所有文档文档q应用程序类(CWinApp)控制应用程序的开始运行、初始化和结束控制应用程序的开始运行、初始化和结束AppWizard、ClassWizard和资源编辑器nAppWizard:创建MFC应用程序nClassWizard:n创建创建Windows消息和命令的处理函数消息和命令的处理函数n创建类成员变量创建类成员变量n创建和管
25、理类创建和管理类n资源编辑器:创建并编辑菜单、对话框、定制控制框、加速键、位图、图标、光标、字符串和版本等资源利用AppWizard编写程序的基本步骤1、利用AppWizard创建应用程序框架2、若需要增加类成员,利用ClassWizard添加3、若需要重载成员函数,利用ClassWizard添加相应的消息映射关系,并填写函数体4、若需要定义类,利用ClassWizard进行定义一个简单的应用程序中的对象Application ObjectDocument TemplateDocumentToolbarStatus BarViewCFrameWnd使用文档/视窗结构的意义n将数据操作与数据显示
26、分开,可以简化工作量;n一组数据可以同时以不同的形式显示在多个视窗中;n类库提供了选择文件、打开文件和关闭文件的管理;n支持打印预览功能视窗类CObjectCCmdTargetCWndCViewCScrollViewCFormViewCEditViewCRecordView视窗类中的OnDraw成员函数 每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw函数。驱使程序调用OnDraw的两个途径:用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据;程序中调用Invalidate(或者InvalidateRect),通知Windows调用OnDraw函数实例48 窗口输
27、出文字与图形n通过实例48 实现在已有框架上添加代码,在程序中显示文字与图形。n程序实现在应用程序文档窗口中输出一行文字,并在窗口中心画一个圆。n首先,建立一个SDI应用程序框架。在CProgram48View:OnDraw()中添加代码nvoid CProgram48View:OnDraw(CDC*pDC)nnCProgram48Doc*pDoc=GetDocument();nASSERT_VALID(pDoc);n/TODO:add draw code for native data heren/以下为新增的代码nCRect r;/定义CRect类对象rnGetClientRect(&r)
28、;/获取客户区窗口坐标范围,窗口的客户区是指窗口中除边框、标题栏、菜单栏等以外的区域。n n int x=0,y=0;n /定义坐标变量,并设置初始值npDC-TextOut(x,y,“在窗口上画一个圆形”);/输出字符串,pDC是指向一个CDC(设备上下文)对象的指针,CDC对象在这里就是指当前文凼窗口。nx=r.right/2;n /更改坐标为窗口中心位置ny=r.bottom/2;npDC-Ellipse(x-100,y-100,x+100,y+100);/画圆n实例49 添加新的消息映射n建立一个SDI的MFC工程。ON_WM_CREATE()默认已建立。n用VIEW-ClassWiz
29、ard为主框架类添加WM_CLOSE消息映射。n在MainFrm.cpp文件中新增的映射宏 ON_WM_CLOSE()在MainFrm.h文件中新增的消息处理函数的声明afx_msg void OnClose();nint CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)nn/添加下面这一行语句,显示对话框nMessageBox(准备建立应用程序,创建程序,MB_OK|MB_ICONEXCLAMATION);nif(CFrameWnd:OnCreate(lpCreateStruct)=-1)nreturn-1;nvoid CMainFrame:OnClose()nn/TODO:Add your message handler code here and/or call defaultnMessageBox(准备销毁程序窗口,撤消窗口,MB_OK|MB_ICONEXCLAMATION);nCFrameWnd:OnClose();nn看实例50-实例54,学习各种消息映射。n(附主要代码附主要代码)
限制150内