为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

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

2010-09-05 50页 ppt 186KB 79阅读

用户头像

is_505567

暂无简介

举报
visual+c++6.0可视化编程2nullnullvisual c++6.0可视化编程 实例47 SDI应用程序框架实例47 SDI应用程序框架建立一个SDI应用程序 第一步选择Single document,其他取默认设置。null项目工作区 类视图 文件视图 资源视图 文件组成 StdAfx.h和StdAfx.cpp包含程序预编译的头文件 Resource.h包含所有资源符号定义的标准头文件。 program47.rc包含资源描述信息的资源文件---图标、位图和光标等。 program47.rc2包含不能在集成开发环境中直接编辑的资源 progra...
visual+c++6.0可视化编程2
nullnullvisual c++6.0可视化编程 实例47 SDI应用程序框架实例47 SDI应用程序框架建立一个SDI应用程序 第一步选择Single document,其他取默认设置。null项目工作区 类视图 文件视图 资源视图 文件组成 StdAfx.h和StdAfx.cpp包含程序预编译的头文件 Resource.h包含所有资源符号定义的标准头文件。 program47.rc包含资源描述信息的资源文件---图标、位图和光标等。 program47.rc2包含不能在集成开发环境中直接编辑的资源 program47.ico是应用程序的图标文件。 program47.bmp是包含工具栏按钮的位图文件,可以在集成环境中进行编辑。 Readme.txt是应用程序描述文件,对AppWizard生成的原文件进行描述用Developer Studio建立项目Developer Studio会创建很多中间文件用Developer Studio建立项目Developer Studio会创建很多中间文件 APS //支持ResourceView BSC //浏览器信息文件 CLW //支持ClassWizard DSP //项目文件,不能删除和用文本编辑器编辑 DSW //工作空间文件,不能删除和用文本编辑器编辑 MAK //外部的创建文件 NCB //支持ClassView OPT //保存工作空间的配置 PLG //建立日志文件 一。应用程序框架一。应用程序框架“应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。应用程序的体系结构应用程序的体系结构基于框架窗口的应用程序 基于对话框的应用程序 基于文档/视图的应用程序与基于框架窗口的程序框架有关的 MFC类结构与基于框架窗口的程序框架有关的 MFC类结构CCmdTarget类CCmdTarget类CCmdTarget 是 MFC 消息映射 结构的基类。消息映射将命令或 消息发送给应用程序编写的处理 命令或消息的响应函数。具有消 息处理能力的类均应为该类的派 生类。CWinThread 类CWinThread 类Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。CWinApp类CWinApp类CWinApp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从CWinApp派生的类对象。CWnd类CWnd类CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。CFrameWnd类CFrameWnd类提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。基于框架窗口的应用程序结构的类关系基于框架窗口的应用程序结构的类关系CWinApp 应用程序对象 m_pMainWndCFrameWnd 应用程序框架窗口程序执行过程程序执行过程初始化应用程序 初始化实例 创建窗口 显示窗口 进入消息循环 结束应用程序WinMain函数WinMain函数WinMain函数是应用程序的入口。 用户不需要编写该函数代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。CWinApp 对象CWinApp 对象CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 InitApplication和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。InitInstance成员函数InitInstance成员函数通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。New ShowWindow UpdateWindowRun 及 ExitInstance成员函数Run 及 ExitInstance成员函数初始化后,WinMain自动调用 Run,它主要负责执行消息循环。 退出应用程序时,WinMain要调用ExitInstace成员函数。null主边框窗口 CProgram47Frame类:此类的对象代着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。 (程序处理举例) CProgram47Frame::OnLButtonDown函数:消息处理机制,当鼠标坐键被按下这一事件被映射到CProgram47Frame的OnLButtonDown函数上,进行消息处理。 视图类 OnPaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作; OnPrint()是当打印一页时被调用,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对OnDraw(CDC *pDC)的调用。程序运行过程分析程序运行过程分析① CProgram47App类:CProgram47App类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。 CProgram47App theApp; 全局对象,在程序开始运行时,调用 CProgram47App类的构造函数生成。 ② WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。 ③应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。null④CProgram47App::InitInstance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。 ⑤CWinApp::Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相应的窗口。 (完成了windows API 中函数GetMessage(), TranslateMessage()和DispatchMessage()的功能。) OnIdle()是在Run()的空闲时间得到执行。当OnIdle()接收到消息后,转送到Run()进行处理。 ExitInstance()用于在程序运行实例终止时,进行相关资源的清理及释放。 ⑥关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CProgram47Frame对象被删除,然后退出Run,进而退出WinMain,最后删除CProgram47App对象。 程序的死亡:程序的死亡: 使用者单击File/Close,于是发出WM-CLOSE CMainWindow并没有设置WM-CLOSE处理程序,于是交给默认的处理程序,默认函数对于WM-CLOSE的处理方式是调用::DestroyWindow, 并因而发出WM-DESTROY默认的WM-DESTROY处理方式是调用::PostQuitMessage,因此发出WM-QUIT.nullCWinApp::Run收到WM-QUIT后会结束内部之消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数;如果CMyWinApp改写了ExitInstance,那么CWinApp::Run所调用的就是CMyWinApp::ExitInstance,否则就是CWinApp::ExitInstance 最后回到AfxWinMain,执行AfxWinTerm,结束程序。nullMFC应用程序编程体现了几个特性: 封装 构成MFC框架的是MFC类库。MFC类库是C++类库。这些类封装了Win32应用程序编程接口、封装了应用程序的概念、封装了OLE特性、封装了ODBC和DAO数据访问的功能等等,分述如下。 null(1)对Win32应用程序编程接口的封装 用一个C++ Object来包装一个Windows Object。例如:CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。null(2)对应用程序概念的封装 使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口等等。这两个部分其实都有相当程度的不变性,MFC就是把有着相当固定行为的WinMain内部操作封装在CWinApp中;把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。也就是说,CWinApp代表Windows应用程序本体,CFrameWnd代表一个主框窗口。 nullMFC把其他许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。 null(3)对COM/OLE特性的封装 OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。 (4)对ODBC功能的封装 以少量的能提供与ODBC之间更高级接口的C++类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。null2.继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中最重要的类是CObject和CmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的。 包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。nullCCmdTarget通过封装一些属性和,提供了消息处理的架构。 MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。 这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CWinThread;文档对象,基类是CDocument,等等。null3.虚拟函数和动态约束 MFC以“C++”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。 例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。null于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。 程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。 MFC编程框架将在适当的时候、适当的地方来调用程序的代码。 null4.MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。 这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。 例如,SDI应用程序的模板,MDI应用程序的模板,DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。null这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。 为了支持对应用程序概念的封装,MFC内部必须作大量的工作:例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。 又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。 虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。 二。MFC 的消息处理机制二。MFC 的消息处理机制框架利用消息映像机制将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息。消息映射的实现消息映射的实现说明:在处理消息的窗口类中说明消息响应函数: 消息响应函数原型 DECLARE_MESSAGE_MAP( ) 实现:在实现程序中说明消息映射 BEGIN_MESSAGE_MAP(派生类,基类) … 各种消息映射宏 END_MESSAGE_MAP( )消息映射项和处理方法消息映射项和处理方法消息响应函数原型: afx_msg void ClassMethod( ) 消息映射宏: ON_MessageName(ID,ClassMethod) 消息响应函数的搜索路径: 自下而上,直到 CCmdTarget CProgram47App中的消息映射 CProgram47App中的消息映射BEGIN_MESSAGE_MAP(CProgram47App, CWinApp) //{{AFX_MSG_MAP(CProgram47App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // ClassWizard将在此处添加/删除成员,用户不要编辑此处区域的代码 //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() null类的消息可以被继承,如果CProgram47App找不到与消息相匹配的消息处理函数时,将转去基类CWinApp中寻找。 如果在所有基类中都找不到消息处理函数,则执行默认的消息处理函数。 用户可以用ClassWizard添加用户需要的消息映射。但有时需要手工在此处加代码。三。窗口输入消息处理三。窗口输入消息处理输入消息分类 鼠标消息: 用户区与非用户区 键盘消息: 系统键消息与非系统键消息鼠标输入消息鼠标输入消息afx_msg void OnMouse_ (UINT nFlags,Cpoint point) afx_msg void On_Button_ (UINT nFlags,CPoint point) nFlags:标识同时按下的虚拟键 point:光标所在的位置键盘输入消息键盘输入消息afx_msg void On_(UINT nChar, UINT nRepCnt,UINT nFlags) nChar:输入字符的ASCII nRepCnt:重复击键的次数 nFlags:虚拟键码...例子应用例子应用利用AppWizard创建应用程序null主要负责初始化、运行和结束应用程序的执行。负责管理操作数据及显示,并接收用户的输入。结论: CFrameWnd派生类 的负担过重。文档、视窗框架结构文档、视窗框架结构主要思想:将原CFrameWnd派生类的任务分配给文档类(CDocument)和视窗类(CView)。文档类主要负责管理数据;视窗类主要负责显示文档,接收用户的输入。文档、视窗框架涉及的主要类文档、视窗框架涉及的主要类文档类(CDocument) 管理程序操作的数据 视窗(CView) 显示数据并接收用户的输入和编辑信息 边框窗口(CFrameWnd) 管理视窗文档、视窗框架涉及的主要类文档、视窗框架涉及的主要类文档模板(CSingleDocTemplate、CMultiDocTemplate) 负责协调文档、视窗和边框窗口的工作。通常,一种特定的文档模板创建并管理已打开的同种类型的所有文档 应用程序类(CWinApp) 控制应用程序的开始运行、初始化和结束AppWizard、ClassWizard和资源编辑器AppWizard、ClassWizard和资源编辑器AppWizard:创建MFC应用程序 ClassWizard: 创建Windows消息和命令的处理函数 创建类成员变量 创建和管理类 资源编辑器:创建并编辑菜单 、对话框、定制控制框、加速键、位图、图标、光标、字符串和版本等资源 利用AppWizard编写程序的基本步骤利用AppWizard编写程序的基本步骤1、利用AppWizard创建应用程序框架 2、若需要增加类成员,利用ClassWizard添加 3、若需要重载成员函数,利用ClassWizard添加相应的消息映射关系,并填写函数体 4、若需要定义类,利用ClassWizard进行定义一个简单的应用程序中的对象一个简单的应用程序中的对象使用文档/视窗结构的意义使用文档/视窗结构的意义将数据操作与数据显示分开,可以简化工作量; 一组数据可以同时以不同的形式显示在多个视窗中; 类库提供了选择文件、打开文件和关闭文件的管理; 支持打印预览功能视窗类视窗类视窗类中的OnDraw成员函数视窗类中的OnDraw成员函数每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw函数。 驱使程序调用OnDraw的两个途径: 用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据; 程序中调用Invalidate(或者InvalidateRect),通知Windows调用OnDraw函数实例48 窗口输出文字与图形实例48 窗口输出文字与图形通过实例48 实现在已有框架上添加代码,在程序中显示文字与图形。 程序实现在应用程序文档窗口中输出一行文字,并在窗口中心画一个圆。 首先,建立一个SDI应用程序框架。在CProgram48View::OnDraw()中添加代码在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(&r); //获取客户区窗口坐标范围,窗口的客户区是指窗口中除边框、标题栏、菜单栏等以外的区域。 null 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); //画圆 } 实例49 添加新的消息映射实例49 添加新的消息映射建立一个SDI的MFC工程。 ON_WM_CREATE()默认已建立。 用VIEW->ClassWizard为主框架类添加WM_CLOSE消息映射。 在MainFrm.cpp文件中新增的映射宏 ON_WM_CLOSE() 在MainFrm.h文件中新增的消息处理函数的声明afx_msg void OnClose(); nullint CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //添加下面这一行语句,显示对话框 MessageBox("准备建立应用程序","创建程序",MB_OK|MB_ICONEXCLAMATION); if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;nullvoid CMainFrame::OnClose() { // TODO: Add your message handler code here and/or call default MessageBox("准备销毁程序窗口","撤消窗口",MB_OK|MB_ICONEXCLAMATION); CFrameWnd::OnClose(); }null看实例50-实例54,学习各种消息映射。 (附主要代码)
/
本文档为【visual+c++6.0可视化编程2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索