




已阅读5页,还剩139页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章MFC编程,主要内容,MFC体系结构用MFCAppwizard自动生成Windows程序文档/视图结构MFCWindows应用程序典型执行过程设计举例,GO,10.1MFC体系结构,基本概念MFC封装了Win32API,目前已包括有200多个类。MFC是一个类层次体系,基类是CObject,其他类大部分是采用单重继承从该类直接或间接派生而来。,10.1MFC体系结构,常用的以CObject为基类的类层次结构如图10.1所示。,图10.1,10.1MFC体系结构,部分CObject派生类的功能(见表10.1)CCmdTarget封装了MFC的消息映射机制,是MFC类库中消息映射体系的基类,希望接收系统事件和窗口消息的类都从它派生。,CWinThread该类的一个对象代表应用程序的一个执行线程,主线程通常由CWinThread的派生类CWinApp的对象提供。,10.1MFC体系结构,部分CObject派生类的功能(见表10.1)CWinApp派生Windows应用程序对象的基类。,CWnd对创建、操纵窗口类的API函数进行了封装,提供了MFC中所有窗口类的基本功能。,CFrameWndSDI应用程序的主框架窗口的基类,也是所有其他框架窗口类的基类。,10.1MFC体系结构,部分CObject派生类的功能(见表10.1)CDocument应用程序文档的基类。,CView应用程序文档的基类。,CDialog所有对话框(模态或者非模态)的基类。,10.1MFC体系结构,部分CObject派生类的功能(见表10.1)CFile提供二进制磁盘文件的访问接口。,CDC设备上下文类的基类,封装了绘图的所有功能函数。,CException所有异常的基类,用于处理各种异常。,10.2用MFCAppwizard自动生成Windows程序,10.2.1应用程序框架10.2.2MFC消息映射10.2.3使用ClassWizard工具,10.2.1应用程序框架,基本概念应用程序框架通常是指一个完整的程序模型,具备标准应用软件所需的一切基本功能,如档案存取、打印预览等,以及这些功能的使用接口,如工具栏、状态栏、菜单等。提供一个一般应用程序所需要的全部面向对象软件组件的集合。,10.2.1应用程序框架,基本概念MFC应用程序框架分类单文档界面应用程序(简称SDI)多文档界面应用程序(简称MDI)基于对话框的应用程序,10.2.1应用程序框架,基于文档/视图结构的应用程序框架【例10.1】实现如图10.2所示的文档/视图结构应用程序的用户界面。,图10.2,10.2.1应用程序框架,选择菜单项,弹出New对话框。,10.2.1应用程序框架,MFCAppWizard-Step1向导对话框,10.2.1应用程序框架,MFCAppWizard-Step2of6对话框,10.2.1应用程序框架,MFCAppWizard-Step3of6对话框,10.2.1应用程序框架,MFCAppWizard-Step4of6对话框,10.2.1应用程序框架,单击Advanced按钮,则弹出AdvancedOptions对话框,10.2.1应用程序框架,10.2.1应用程序框架,MFCAppWizard-Step5of6对话框,10.2.1应用程序框架,MFCAppWizard-Step6of6对话框,10.2.1应用程序框架,NewProjectInformation对话框,10.2.1应用程序框架,选择Build|ExecuteS1.exe菜单项或者按Ctrl+F5键,运行程序,可得到图示运行结果。,10.2.1应用程序框架,工作区组成,10.2.1应用程序框架,系统默认工程名的修改方法操作步骤:在工作区中选择“ResourceView”标签,展开各资源项。打开“StringTable”文件夹,双击包含的“StringTable”项,在客户区会看到表中的内容。在ID为“IDR_MAINFRAME”上双击,将打开“StringProperties”对话框。在Caption编辑框中修改第一个“n”前的字符串为要设置的应用程序标题。,10.2.1应用程序框架,SDI应用程序的组成一个典型的SDI应用程序一般由四个类组成:主框架窗口类(CMainFrame)由AppWizard自动添加。基类是CFrameWnd,框架类负责管理程序的主窗口,包含窗口边框、标题栏、菜单栏、系统菜单栏、工具栏、状态栏等各种元素。类的定义和实现文件分别是MainFrm.h和MainFrm.cpp。,10.2.1应用程序框架,SDI应用程序的组成应用程序类(CS1App)基类是CWinApp,应用程序类是应用程序运行的基础,用来管理整个应用程序,封装了Windows应用程序要做的初始化、运行和终止三大主要任务。该类的定义和实现文件分别是S1.h和S1.cpp。,10.2.1应用程序框架,SDI应用程序的组成文档类(CS1Doc)基类是CDocument,文档类封装了应用程序的数据管理功能,负责存放程序数据、读出数据并进行I/O操作。该类的定义和实现文件分别是S1Doc.h和S1Doc.cpp。,10.2.1应用程序框架,SDI应用程序的组成视图类(CS1View)基类是CView,视图类负责管理视图窗口,显示程序中的数据和处理用户输入,而数据是从文档类中获得,视图窗口是框架窗口的子窗口,显示在主框架窗口的客户区中。该类的定义和实现文件分别是S1View.h和S1Viw.cpp。,10.2.1应用程序框架,说明在MDI应用程序中,除了具有SDI应用程序中的四个类外,还包括子框架窗口类。此时主框架窗口类的基类为CMDIFrameWnd类,子框架窗口(文档框架窗口)类的基类为CMDIChildWnd类。,10.2.1应用程序框架,基于对话框结构的应用程序框架【例10.2】实现如图10.14所示的用户界面。,图10.14,10.2.1应用程序框架,操作步骤:选择菜单项,弹出New对话框。,10.2.1应用程序框架,MFCAppWizard-Step1向导对话框,10.2.1应用程序框架,MFCAppWizard-Step2of4对话框,10.2.1应用程序框架,MFCAppWizard-Step3of4对话框,10.2.1应用程序框架,MFCAppWizard-Step4of4对话框,10.2.1应用程序框架,弹出NewProjectInformation对话框,10.2.1应用程序框架,说明该应用程序的标题默认为工程名S2。用户可以更改标题:在工作区中单击“ResourceView”标签,展开“Dialog”结点。双击打开“IDD_S2_DIALOG”资源,并在其上单击鼠标右键。在快捷菜单中单击“Properties”菜单项,打开对话框属性对话框,在General标签中修改Caption的值。,10.2.1应用程序框架,工程的文件组成文件夹Debug:用于存放编译、链接时产生的中间文件和可执行文件。Res:用于存放工程的资源文件。,工程文件(以E:SampleS1为例)S1.dsw:工作区文件,保存了工程所属的工作区信息。S1.dsp:工程文件,保存了用户所建工程的有关信息,10.2.1应用程序框架,工程的文件组成工程文件(以E:SampleS1为例)S1.opt:工作区选项文件,保存了用户为所建工作区所定制的一些选项,当每次打开该工作区时可自动设置用户定制的选项状态。,S1.clw:为ClassWizard数据库文件,存放由ClassWizard使用的信息,Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射、以及创建成员函数的原型。,S1.ncb:非编译的浏览文件,包含了由分析器产生的一些信息,可被ClassView、WizardBar和ComponentGallery利用。,10.2.1应用程序框架,工程的文件组成预编译头文件StdAfx.h和StdAfx.cpp:这两个文件用来产生预编译头文件S1.pch和一个OBJ文件StdAfx.obj。,10.2.1应用程序框架,工程的文件组成资源文件S1.rc和Resource.h:包含了一般MFC应用程序用到的所有资源,如菜单、加速键、字符串表以及About对话框、图标文件、位图文件。,resS1.rc2:包含VisualC+不能直接编辑的资源,可以将所有不能由资源编辑器编辑的资源放置到这个文件中。,resS1.ico:图标文件。,resToolbar.bmp:用于创建工具栏按钮的位图文件。,resS1Doc.ico:文件类型的图标文件。,10.2.1应用程序框架,工程的文件组成帮助文件若用户在MFCAppWizard-Step4of6对话框中选择了“提供上下文相关帮助”,则会在工程目录上生成一个hlp子目录,并产生一系列所需帮助文件。,10.2.2MFC消息映射,应用程序模式过程控制模式在MS-DOS的控制台应用程序中,main函数是程序的入口,按照程序语句的执行流程来控制程序代码的执行。执行的顺序和方式是在编写程序时设置好的,这种程序模式称为过程控制模式。,事件驱动模式Windows程序的控制流程不再由事件的预定发生顺序来决定,而是由实际运行时各种事件的实际发生来触发。,10.2.2MFC消息映射,Windows消息机制Windows消息分类标准Windows消息:以WM_为前缀的消息(除WM_COMMAND)。,命令消息:当用户选择菜单、工具栏、加速键时产生的消息,也以WM_COMMAND为消息名,在消息中包含有命令的标识符(ID),以区分具体的命令。,控件通知消息:以WM_COMMAND为消息名,由编辑框、列表框等控件或子窗口发给其父窗口的通知消息。,10.2.2MFC消息映射,Windows消息机制MSG结构体,typedefstructtagMSGHWNDhwnd;/接收消息的窗口句柄UINTmessage;/消息类型WPARAMwParam;LPARAMlParam;/消息的附加信息DWORDtime;/消息发送时间POINTpt;/消息发送时光标在屏幕上的位置MSG;,10.2.2MFC消息映射,Windows消息机制消息队列系统消息队列应用程序(消息)队列,窗口过程每个窗口会有一个称为窗口过程(WndProc)的回调函数。它带有四个参数:窗口句柄,消息ID,和两个消息参数(wParam,lParam)。当窗口收到消息时系统就会调用此窗口过程来处理消息,即消息响应。任何一个窗口类都有一个窗口过程,同一个类的窗口使用同样的窗口过程来响应消息。,10.2.2MFC消息映射,Windows消息机制Windows消息从产生到响应处理的过程,10.2.2MFC消息映射,Windows消息机制Windows消息从产生到响应处理的过程消息循环过程代码如下:,while(GetMessage(,10.2.2MFC消息映射,MFC消息映射机制基本概念MFC把所有图形用户界面元素(如对话框、按钮、编辑框和菜单等)以类的方式封装,使用消息映射宏将这些图形用户界面元素所发出的消息“映射”到消息处理函数进行处理。,消息处理函数是以CCmdTarget为基类的派生类成员函数,CCmdTarget类是MFC处理命令消息的基础和核心。,10.2.2MFC消息映射,MFC消息映射机制在VC+中建立消息映射必须遵循的规范声明消息处理函数首先,在需要进行消息处理的类定义头文件中,在成员定义末尾加入DECLARE_MESSAGE_MAP宏。其语法格式如下:DECLARE_MESSAGE_MAP(),其次,在需要进行消息处理的类的定义中声明消息处理函数,其语法格式如下:/AFX_MSG(子类名)afx_msg类型函数名(形参表);/AFX_MSG,10.2.2MFC消息映射,MFC消息映射机制在VC+中建立消息映射必须遵循的规范建立消息与处理函数之间的映射在需要进行消息处理的类的实现文件中加入如下代码:,BEGIN_MESSAGE_MAP(子类名,父类名)/消息映射宏定义或消息映射语句,一般有若干个ON_COMMAND.(消息名或控制号,处理函数名)ON_WM_END_MESSAGE_MAP(),10.2.2MFC消息映射,MFC消息映射机制在VC+中建立消息映射必须遵循的规范添加消息处理函数在需要进行消息处理的类的实现文件中添加消息处理函数,其语法格式如下:类型类名:处理函数名(形参表)/处理代码,10.2.2MFC消息映射,说明:消息映射的这三项内容既可手工加入,也可以使用ClassWizard工具。ClassWizard为消息处理程序自动生成函数原型和空的函数定义,用户需要根据实际功能添加具体的消息处理函数体代码。,10.2.2MFC消息映射,MFC命令消息的传递机制基本概念命令消息在应用程序类、文档类、视图类、以及框架窗口类中都可以进行处理。,当产生一个命令消息时,该消息的接收和处理对象是有不同的优先级的,消息是按一定的路径进行传递的。,10.2.2MFC消息映射,MFC命令消息的传递机制【例10.3】为例10.1完成的S1工程添加菜单项“测试”,并分别在视图类、文档类、框架类和应用程序类中为其添加消息映射,然后测试消息对视图对象、文档对象、框架对象和应用程序对象的响应优先级。,操作步骤略。,命令消息的处理过程,10.2.2MFC消息映射,MFC命令消息的传递机制用户消息(鼠标、键盘输入等)会先发往主框架窗口对象(对于MDI应用程序,会再将消息的处理机会传递给当前活动的MDI子框架窗口)。,主/子框架窗口对象则将消息传递给当前活动视图对象。,视图对象先搜索自己的消息映射,如果没有找到该消息的处理函数,则将消息传递给与此视图关联的文档对象。,如果文档对象也没有处理该消息则又将消息传递给文档模板对象。,10.2.2MFC消息映射,MFC命令消息的传递机制如果在文档模板对象中也没有找到该消息的处理函数,则消息又被传回主/子框架窗口对象。,主/子框架窗口对象搜索自己的消息映射(对于MDI应用程序,如果子框架窗口中没有处理函数,命令消息就被传回给主框架窗口),如果找到就进行处理。,如果在主框架窗口对象没有处理该消息,则由应用程序对象来处理未被处理的命令消息。,10.2.3使用ClassWizard工具,打开ClassWizard工具当打开一个工作区文件后,选择View|ClassWizard菜单项,可打开MFCClassWizard窗口。,主要功能使用ClassWizard进行消息映射使用ClassWizard添加类使用ClassWizard添加成员变量覆盖基类虚成员函数,10.2.3使用ClassWizard工具,使用ClassWizard进行消息映射ClassWizard对话框的MessageMaps页面的功能,10.2.3使用ClassWizard工具,使用ClassWizard进行消息映射【例10.4】在例10.1完成的S1工程的“查看”菜单下添加菜单项“Hello”,并使用ClassWizard工具添加对该菜单项的消息响应,要求该菜单项的消息响应只是弹出一个“Hello”消息框。具体操作步骤略。,10.2.3使用ClassWizard工具,10.2.3使用ClassWizard工具,voidCS1View:OnMenuHello()/TODO:AddyourcommandhandlercodehereMessageBox(Hello);,10.2.3使用ClassWizard工具,说明:需要删除某个消息映射函数,需要首先用ClassWizard工具删除消息映射入口项和消息处理成员函数的函数原型,然后在该消息映射函数所在的实现文件(.cpp)中手动删除该消息处理成员函数的定义代码。,10.2.3使用ClassWizard工具,使用ClassWizard添加类在打开MFCClassWizard对话框的过程中,如果系统检测到有新建的对话框资源、菜单资源,并且这些资源没有与相应的类关联,就会弹出“AddingaClass”对话框,询问是否创建新类。,【例10.5】在例10.1完成的S1工程中,添加如图10.31所示的登录对话框,并使用ClassWizard为该登录对话框资源添加类。具体操作步骤略。,10.2.3使用ClassWizard工具,插入对话框资源:,10.2.3使用ClassWizard工具,10.2.3使用ClassWizard工具,修改对话框ID和标题:,10.2.3使用ClassWizard工具,添加控件:,10.2.3使用ClassWizard工具,设置控件属性:,10.2.3使用ClassWizard工具,鼠标在该对话框资源任意处双击(或打开MFCClassWizard对话框时)会弹出“AddingaClass”对话框:,10.2.3使用ClassWizard工具,使用ClassWizard添加成员变量利用ClassWizard,可以方便地向类中添加成员变量,并将这些成员变量与对话框或窗口中的控件关联起来,当控件的值改变时,所对应的成员变量的值也跟着发生变化。,【例10.6】向例10.5中的CLoginDialog类中添加成员变量,使它们与相应的控件相关联。具体操作步骤略。,10.2.3使用ClassWizard工具,【例10.7】测试例10.5和例10.6完成的登录对话框,要求在主界面显示之前弹出一个登录对话框,由用户输入用户名和密码,如果输入正确,则程序继续执行,否则程序终止。具体操作步骤略。,在CS1App:InitInstance()函数中添加代码:,CLoginDialogm_Dlg;/声明CLoginDialog类的一个对象if(m_Dlg.DoModal()=IDOK)/用户按了“确定”按钮/用户名为“333”,密码为“666”if(m_Dlg.m_Username!=333|m_Dlg.m_Password!=666)/如果输入不正确则显示出错信息,然后程序结束MessageBox(NULL,输入有误,确定后将退出程序。,错误,MB_OK|MB_ICONERROR);returnFALSE;else/如果按下“取消”按钮,程序结束returnFALSE;,注意:在文件S1.cpp的头部添加下面的包含语句:#includeLoginDialog.h,10.2.3使用ClassWizard工具,覆盖基类虚成员函数在MFC类库中,很多成员函数在声明时都有virtual关键字,即它们都是虚成员函数。,当创建基于MFC的应用程序时,在用户的派生类中往往需要重新定义基类的虚成员函数,这样当通过基类对象指针(或引用)调用虚成员函数时,可以实现运行时的多态性。,10.2.3使用ClassWizard工具,【例10.8】在例10.1完成的S1工程的文档类CS1Doc中添加Serialize成员函数,从而覆盖基类CDocument中定义的Serialize虚成员函数。具体操作步骤略。,添加Serialize成员函数,在S1Doc.h中可以看到该虚成员函数的声明:,在S1Doc.cpp中可以看到该虚成员函数的定义:,virtualvoidSerialize(CArchive,voidCS1Doc:Serialize(CArchivepDocTemplate=newCSingleDocTemplate(/指定这个文档显示时候采用的菜单资源IDR_MAINFRAME,RUNTIME_CLASS(CS1Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CS1View);AddDocTemplate(pDocTemplate,10.3.1文档模板类,CDocTemplate在MDI程序中文档模板类的使用(以S1工程为例)在CS1App的InitInstance函数中:,CMultiDocTemplate*pDocTemplate;pDocTemplate=newCMultiDocTemplate(IDR_S1TYPE,/同上RUNTIME_CLASS(CS1Doc),RUNTIME_CLASS(CChildFrame),RUNTIME_CLASS(CS1View);AddDocTemplate(pDocTemplate);,10.3.2文档类,CDocument类CDocument是所有文档类的基类,它对文档的建立及归档提供支持,并提供了应用程序用于控制其数据的接口。该类的定义在“afxwin.h”文件中。,10.3.2文档类,文档类的主要成员函数添加视图成员函数voidAddView(CView*pView),将一个视图连接到文档上,并将视图的文档指针指向该文档。,一个文档可以有多个视图,每个文档都维护一个链表来管理与之关联的视图,该链表在CDocument类中的定义为:CPtrListm_viewList。,10.3.2文档类,文档类的主要成员函数删除视图成员函数voidRemoveView(CView*pView),创建文档成员函数virtualBOOLOnNewDocument()当用户启动应用程序,或选择“”菜单时,会触发该函数的执行。,打开文档成员函数virtualBOOLOnOpenDocument(LPCTSTRlpszPathName),10.3.2文档类,文档类的主要成员函数保存文档成员函数virtualBOOLOnSaveDocument(LPCTSTRlpszPathName),关闭文档成员函数virtualvoidOnCloseDocument(),10.3.2文档类,文档类的主要成员函数【例10.9】在例10.1完成的S1工程中,实现在客户区单击鼠标左键连线绘图,提供绘图文件的保存和打开功能。具体操作步骤略。,10.3.2文档类,在CS1Doc类中添加如下公有成员变量:,intm_nCount;/记录当前点的个数CPointm_ptPosition100;/记录点的坐标,CS1Doc:CS1Doc()/TODO:addone-timeconstructioncodeherem_nCount=0;for(inti=0;im_nCountm_ptPositionpDoc-m_nCount=point;/将点的个数进行累加pDoc-m_nCount+;Invalidate();/刷新屏幕CView:OnLButtonDown(nFlags,point);,10.3.2文档类,说明:Invalidate()是使视图类窗口无效(即需要重绘)的函数,它有一个默认的参数TRUE,即Invalidate(TRUE)。,该函数会产生一个WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint函数负责重绘窗口。,在视图类的OnPaint函数中调用了OnDraw函数。,10.3.2文档类,修改CS1View:OnDraw函数,对鼠标单击过的点进行连线绘图:,voidCS1View:OnDraw(CDC*pDC)CS1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-MoveTo(pDoc-m_ptPosition0);for(inti=1;im_nCount;i+)pDC-LineTo(pDoc-m_ptPositioni);,10.3.2文档类,运行S1工程:在视图区连续单击鼠标左键可绘成连线。但不能保存当前绘图文件。为了能保存绘制结果,需要对文档类的成员变量m_nCount和m_ptPosition100进行序列化处理。,10.3.2文档类,修改CS1Doc:Serialize函数:,voidCS1Doc:Serialize(CArchive,10.3.2文档类,执行S1工程:,10.3.2文档类,10.3.2文档类,MFC对象序列化机制基本概念对象的序列化将对象当前状态(通常由该对象的成员变量指示)写入永久性存储介质(如磁盘文件),或从永久性存储介质中读取对象状态恢复到内存的过程称为对象的序列化。,10.3.2文档类,MFC对象序列化机制基本概念对象的持久性对象所具有的保存和加载其状态数据的能力称为对象的持久性。,持久性对象能够在应用程序结束之前以某种方式将当前的对象状态数据记录下来,当程序再次运行时,通过对这些数据的读取而恢复到上一次任务结束时的状态。,10.3.2文档类,MFC对象序列化机制CArchiveCArchive类的对象用作将被序列化的对象和存储介质之间的中介物。,当进行打开/保存文件操作时,系统会构造一个CArchive对象,并将其与一个打开文件的CFile对象相关联,从CFile对象获得序列化所需的信息,包括文件名和请求的操作是读取还是写入。,然后这个CArchive对象会调用CDocument派生类的Serialize成员函数,在Serialize函数完成读写操作后,自动删除CArchive对象和CFile对象。,10.3.2文档类,MFC对象序列化机制MFC对CObject派生类的序列化提供内置支持,CObject派生类可以重载CObject:Serialize函数实现序列化操作,即所有的CObject派生类都是具有持久性的。,10.3.2文档类,MFC对象序列化机制使一个类可序列化需要完成如下五个步骤:该类直接或间接从CObject类派生;,在该类中重载Serialize成员函数;,在该类声明文件中使用DECLARE_SERIAL宏,该宏只需要将类名作为参数;,在该类中定义一个无参构造函数。若一个对象来自文件,MFC必须以无参构造函数动态创建它,然后从文件中读取对象的状态数据;,在该类实现文件中使用IMPLEMENT_SERIAL宏。该宏需要三个参数:类名,基类名和一个方案号。其中方案号是一个相当于版本号的整数,每当改变了类的序列化数据格式后就应当及时更改此数值。,10.3.2文档类,MFC对象序列化机制【例10.10】将例10.9中的绘图数据进行封装,创建可序列化类CCurve,实现绘图数据的持久性。,classCCurve:publicCObjectDECLARE_SERIAL(CCurve)public:intm_nCount;CPointm_ptPosition100;CCurve();virtualCCurve()voidSerialize(CArchive,操作步骤:创建“curve.h”文件,定义CCurve类来封装曲线位置数据:,10.3.2文档类,创建“curve.cpp”文件,在CCurve类的构造函数中进行数据的初始化:,#includeCurve.h“IMPLEMENT_SERIAL(CCurve,CObject,0)CCurve:CCurve()m_nCount=0;for(inti=0;im_pCur-m_ptPositionpDoc-m_pCur-m_nCount=point;if(pDoc-m_pCur-m_nCountm_pCur-m_nCount+;Invalidate();/刷新屏幕CView:OnLButtonDown(nFlags,point);,10.3.2文档类,修改重绘函数为:,voidCS1View:OnDraw(CDC*pDC)CS1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-MoveTo(pDoc-m_pCur-m_ptPosition0);for(inti=1;im_pCur-m_nCount;i+)pDC-LineTo(pDoc-m_pCur-m_ptPositioni);,10.3.2文档类,执行S1工程:实现了单击鼠标左键连线绘图。可对绘图文件进行保存和打开。,10.3.3视图类,CView在MFC“文档/视图”结构中,CView类是所有视图类的基类。,该类的定义在“afxwin.h”文件中,它提供了用户自定义视图类的公共接口。,视图类负责如下工作:从文档类中将文档中的数据取出后显示给用户。接受用户对文档中数据的编辑和修改。将修改的结果反馈给文档类,由文档类将修改后的内容保存到磁盘文件中。,10.3.3视图类,在视图类的派生类中的重载函数获取文档指针成员函数CDocument*GetDocument()const;返回与视图关联的文档对象的指针。如果视图没有与文档关联则返回NULL值。,重绘客户区成员函数virtualvoidOnDraw(CDC*pDC)=0;负责将文档的内容在视图窗口中显示,并在需要时对窗口内容进行重绘。,10.3.3视图类,说明:当视图窗口的内容需要重绘时(如第一次创建窗口、窗口改变位置和大小、从打开的文件中显示数据等等),Windows就会给应用程序发送WM_PAINT消息,从而调用视图类相应的消息处理函数OnPaint()(在CView类中定义)。,OnPaint()函数主要就是调用OnDraw()函数,由于该虚函数在派生类中被重载,所以调用的就是派生视图类的OnDraw()函数。,10.3.3视图类,在视图类的派生类中的重载函数新建窗口成员函数virtualBOOLPreCreateWindow(CREATESTRUCT&cs);通过修改CREATESTRUCT结构体类型数据而修改窗口风格。,10.3.3视图类,CView类层次,10.4MFCWindows应用程序典型执行过程,10.4.1Windows应用程序执行过程10.4.2MFCWindows应用程序执行过程,10.4.1Windows应用程序执行过程,【例10.11】在VisualC+中使用向导创建一个实现图10.45功能的“Win32Application”类型的应用程序。,操作步骤:在New对话框的“Project”标签中选择“Win32Application”,输入工程名“S3”,保存路径为“E:Samples”。,在Win32Application-Step1of1对话框,选择创建一个典型的“HelloWorld!”应用程序。,在NewProjectInformation对话框,确认创建信息。,10.4.1Windows应用程序执行过程,Windows应用程序的一般执行过程Windows应用程序启动时的入口函数为WinMain函数,其第一个参数为操作系统分配的应用程序实例句柄。,在WinMain函数中,首先调用MyRegisterClass函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保基础知识培训课件
- 2025年陕西省事业单位招聘考试综合类专业技能测试试卷(生物医学工程)
- 2025年摄影艺术师(职业资格)职业技能鉴定理论试卷
- 2025年日语能力测试N3级阅读专项试卷(证券法)
- 城市生态价值评估与可持续利用-洞察及研究
- 2025年美甲师初级(美甲工具使用)考试试卷解析
- 2025年托福考试预测试卷:新能源技术发展趋势
- 森林凋落物分解机制-洞察及研究
- 2025年西式面点师西点制作与创业计划书考试试卷
- 2025年起重机械作业特种作业操作证考试试卷(起重机械操作设备操作安全教育培训)
- 精神科护理不良事件分析讨论
- 督灸技术操作流程图及考核标准
- 电梯维护保养与安全操作实务培训
- 人工智能导论-第2版-全套课件
- 气溶胶大气边界层研究-深度研究
- 2025年中国协同办公软件行业市场发展前景及发展趋势与投资战略研究报告
- 颈椎病课件完整版
- 传染科专科护士培训
- 综合设计我的书包课件
- 《海洋遥感技术》课件
- 企业人力资源管理师三级历年真题及答案(2024年11月-2025年5月)版
评论
0/150
提交评论