版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档视结构第11章本章主要内容11.2 切分视图11.1 文档/视图结构11.3 文档序列化11.1.1 文档、视图、框架基本概念单文档程序的流程单文档模板字符串多文档程序结构1、基本概念MFC程序中将数据的维护与显示分离,分别由紧密相关的两个类对象负责文档类对象:相当于一个数据容器或数据管理中心,用于管理数据。文档基类为CDocument视图类对象:显示数据的窗口,视同时负责与用户的交互,将用户对数据的改变写入文档中,当文档中的数据发生变化时,由视中的OnDraw负责显示的更新。视图基类为CView。文档和视图的关系是“一对多”,一个文档可以有多个视图对应。基本概念主框架窗口主框架窗口是顶层
2、窗口,带有边框、标题栏、菜单等;工具栏、状态栏、视图窗口是它的子窗口。单文档主框架窗口基类为CFrameWnd。文档模板:总管文档/视/框架是捆绑在一起的三个有机对象,MFC通过文档模板来管理它们应用程序:在应用程序中定义一个文档模板对象,建立和关联文档/视/框架的关联。基本概念各司其职通常将数据保存在文档中,当文档数据发生变化后,通知所有视图更新;视图中通过OnDraw显示文档数据,因为视图作为覆盖了主框架窗口的客户区,负责与用户的交互(如鼠标、键盘操作常映射到视图类),并将数据存入文档;框架负责各种子窗口的管理。2、单文档程序流程应用程序类的InitInstance方法中部分代码 CSin
3、gleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CDrawDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CDrawView);AddDocTemplate(pDocTemplate);单文档程序的执行过程创建应用程序类对象InitInstance;创建SDI文档模板对象;构造文档类对象,不读取数据构造主框架类对象,创建主窗口,不显示有主框架构造视图对象,创建视图窗口,但不显示建立视图、框架、文档对象间的
4、联系调用文档的OnNewDocument调用视图的OnInitialUpdate调用框架的ActiveFrame,显示窗口、子窗口3、单文档文档模板字符串双击文档模板字符串含义窗口标题文档根名称,默认为“无标题”新建文档类型名文件过滤器正文文档扩展名示例:修改文档模板字符串通过修改文档模板字符串,使得打开或保存文档时,过滤cpp文档。效果图4、多文档程序结构主框架类CMaiFrame基类CMDIFrameWnd,仅有一个,拥有菜单和工具栏等,不包含视图对象,可以包含多个子框架窗口,在InitInstance中创建。子框架类CChildFrame基类CMDIChildWnd,多个(每个子窗口一个
5、),没有菜单和工具栏,每个子框架包含一个视图对象,创建新子窗口时创建每次创建或打开新文档时,创建子框架窗口、文档、视图对象。多文档程序流程 CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_SIMPLETYPE,RUNTIME_CLASS(CSimpleDoc),RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CSimpleView);AddDocTemplate(pDocTemplate);CMainFrame* pMainFrame = new CMainFr
6、ame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFrame;MDI关联文档/视/子框架窗口多文档程序的执行过程创建应用程序类对象InitInstance创建MDI文档模板对象;构造主框架类对象,创建主窗口,但不显示间接调用OnFileNew,先构造文档对象构造子框架窗口对象,创建主框架窗口构造视图对象,创建视图窗口每次打开或新建文档,均执行相似的过程,每个文档对应一套文档/视/子框架窗口。单文档与多文档比较单文档主框架窗口包含视图,程序中只有一套文档/视/框架;每次新建或打开文档时不重新创建文
7、档、视图、框架对象,只是更新内容而已;多文档主框架窗口包含子框架窗口作为子窗口,子框架窗口含视图,程序中可以有多套文档/视/子框架窗口;每新建一个文件或打开文件,都要创建各自的文档、视和子框架窗口。多文档文档模板字符串由两个字符串构成IDR_MAINFRAME:对应单文档文档模板字符串资源的第一项,对应应用程序标题。IDR_SIMPLETYPE对应单文档文档模板字符串资源的后六项。 11.1.2 相互作用文档视图相互作用文档类的几个重要成员函数视图与框架窗口作用控制框架窗口显示1、文档视图相互作用视图类中获得文档类对象指针GetDocument,得到文档对象指针后,可以访问其中的公有成员。文档
8、类中UpdateAllViews:更新与文档关联的视图窗口,第一个参数为NULL表示更新所有视图,如为某个窗口指针,更新该窗口以外的所有视图当文档类数据发生变化时,应调用该函数更新相关的视图。文档视图相互作用视图类的OnUpdate是视图的虚函数,每当文档类调用了UpdateAllViews后,会调用被更新视图类的OnUpdate函数,该函数默认调用Invalidate刷新整个客户区。void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );void OnUpdate( CView* pSen
9、der, LPARAM lHint, CObject* pHint );文档视图相互作用视图类的OnInitialUpdate应用程序被启动时,或“文件”菜单中选择了“新建”或“打开”时,该虚函数会被自动调用。该函数默认会调用无参数的OnUpdate函数。用户可以重载此函数以初始化视图显示;如果采用SCrollView作为视图类,应该在该函数中设置映射模式。2、文档的几个成员文档类的OnNewDocument在文档应用程序中,点击“文件”菜单中的“新建”命令时,或者首次创建文档对象时,会调用该虚函数。对于单文档应用程序,必须在该虚函数中对新建文档数据的初始化,而不应该将初始化工作放在构造函数中
10、。文档的几个成员文档类的OnOpenDocument在文档应用程序中,点击“文件”菜单中的“打开”命令时,会调用该虚函数。默认会调用DeleteContents清空文档对象,然后调用Serialize完成文档序列化。对于单文档的打开文档的初始化操作,要放在该函数中,而不能放在构造函数中。 文档的几个成员文档类的OnDeleteContents点击“文件”“打开”或“新建”菜单时,OnOpenDocument和OnNewDocument会调用该函数,以清空文档。当关闭文档时,也会调用该函数。对于单文档应用程序,由于重用同一个文档对象,应该重载该函数,完成文档清理工作。 文档的几个成员文档类的Se
11、tModifiedFlag和IsModified文档类有一个BOO型的标志变量,用于标识文档数据是否已经被修改,当该标识为true时,标识数据已经被修改。关闭主框架窗口时,会根据该标识提示用户保存数据修改。当更新数据后,应调用SetModifiedFlag(true)将更新标志设置为true;IsModified函数用于返回该标志变量。文档的几个成员如果一个文档对应多个视图GetFirstViewPosition函数获得与文档类相关联的视图列表中第一个可见视图的位置;GetNextView函数获取指定视图位置的视图类指针,并将此视图位置移动到下一个位置,若没有下一个视图,则视图位置为NULL。
12、POSITION GetFirstViewPosition( );CView* GetNextView( POSITION& rPosition );3、视图与框架窗口作用视图中获得主框架窗口对象指针GetParentFrame:获得直接包容视图的子窗口(对于SDI为主框架窗口,对于MDI即为包容当前视图的子框架窗口)获得主框架窗口:先获得应用程序对象,由应用程序对象的m_pMainWnd得到主框架窗口。视图与框架窗口作用MDI主框架窗口类GetActiveFrame:获得活动子框架窗口,如果为SDI或没有活动子窗口,返回主窗口本身。MDIGetActive:获得活动子框架窗口指针,如果没有活
13、动子窗口,返回NULL视图与框架窗口作用子框架窗口类GetActiveView:获得与当前子框架窗口连接的活动视图对象指针(不能在MDI主框架窗口中调用该函数,返回NULL,因为MDI的主框架窗口无关联的视图)GetMDIFrame:获得主框架窗口2个全局函数AfxGetApp():获得应用程序对象AfxGetMainWnd:获得主框架窗口4、控制主窗口状态设置主窗口风格BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)cs.style&=WS_MAXIMIZEBOX;cs.cy=:GetSystemMetrics(SM_CYSCREEN)/3;
14、cs.cx=:GetSystemMetrics(SM_CXSCREEN)/3;cs.y=(cs.cy*3)-cs.cy)/2;cs.x=(cs.cx*3)-cs.cx)/2;return CFrameWnd:PreCreateWindow(cs); /增加风格cs.style|=WS_常用的属性值其它的窗口风格WS_MAXIMIZE:最大化WS_MINIMIZE:最小化WS_MINIMIZEBOX:最小化按钮可用WS_MAXIMIZEBOX:最大化按钮可用WS_SYSMENU:含系统菜单控制子窗口状态控制子窗口风格CChildFrame的PreCreateWindow函数BOOL CChild
15、Frame:PreCreateWindow (CREATESTRUCT& cs)cs.style&=WS_MAXIMIZEBOX;if( !CMDIChildWnd:PreCreateWindow(cs) )return FALSE;return TRUE;InitInstance中控制窗口显示/ 默认显示方式为SW_SHOWNORMALm_nCmdShow=SW_SHOWMAXIMIZED;pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow();/ SW_SHOWMINIMIZED 最小化InitInstance中控制窗口显示p
16、MainFrame-UpdateWindow();CRect rcWindow;m_pMainWnd-GetWindowRect(rcWindow);m_pMainWnd-MoveWindow(500,100,rcWindow.Width(),rcWindow.Height(),true);/ m_pMainWnd-CenterWindow();CChildFrame *pChild=(CChildFrame *) pMainFrame-MDIGetActive();pChild-CenterWindow();视图类中控制主、子框架窗口void CDSpliteView:OnLButtonDo
17、wn() CChildFrame *pChild= (CChildFrame *)GetParentFrame(); pChild-CenterWindow(); AfxGetMainWnd()-CenterWindow(); CView:OnLButtonDown(nFlags, point);本章主要内容11.2 切分视图11.1 文档/视图结构11.3 文档序列化1、基础知识通过CSplitterWnd,可以将“视图”切分为多个窗格,每个窗格为某种视图类对象(由CView派生)SDI程序,将CSplitterWnd嵌入主框架类中,MDI程序,将CSplitterWnd嵌入在CMDIChi
18、ldWnd类中动态分隔:创建的多个窗格都属于同一个视图类静态分隔:创建的每个窗格对应不同视图类2、动态切分方法创建工程的第4步动态切分方法修改子框架类的OnCreateClientBOOL CChildFrame:OnCreateClient( ) return m_wndSplitter.Create( this,2,2,CSize(10,10),pContext);切分为2行2列动态切分方法若未选中Use split WindowSDI为例,在CMaiFrame中添加成员变量CSplitterWnd m_wndSplitter;映射OnCreateClient函数,创建分隔视窗BOOL C
19、MainFrame:OnCreateClient() return m_wndSplitter.Create( this, 2,2,CSize(10,10),pContext);3、静态切分示例任务将程序视图切分为两个部分,左侧用于选择某种图形,右侧的视图窗口用于显示图形需要两个视图类,以有的程序用CView作为客户区窗口,需要添加一个视图类,本例选用CFormView作为左侧的视图类CFormView类似对话框,关联一个对话框资源,可以在视中放置控件文档类中添加成员创建SDI项目向导第4步,选中Use Split window选项文档类中添加成员变量,在构造函数中初始为0,用于表示用户选择何
20、种类型图形int m_type;/ m_type:0表示画线,1表示画矩形,2表示画圆一档多视的情况下,往往间数据都保存在文档类中,便于访问创建对话框资源创建对话框资源(左侧视图)执行InsertResource,选择Dialog下的IDD_FORMVIEW项,删除默认的控件,添加如下的控件关联对话框类为对话框资源关联类双击对话框资源,基类选择CFormView,类名称为CDataView为IDC_RADIO1关联成员变量int m_type构造函数中初始化为0;静态切分修改主框架类OnCreateClientBOOL CMainFrame:OnCreateClient(LPCREATESTR
21、UCT lpcs, CCreateContext* pContext) m_wndSplitter.CreateStatic(this,1,2);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDataView),CSize(0,0),pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSSplitView),CSize(0,0),pContext);CDataView是构造的视,CSSplitView是默认生成的静态切分BOOL CMainFrame:OnCreateClient() CDataV
22、iew *pWnd=(CDataView *)m_wndSplitter.GetPane(0,0);/ 获得指定窗格对象的指针CSize size=pWnd-GetTotalSize();m_wndSplitter.SetColumnInfo(0,size.cx,0);return true; / 需要包含相应的头文件/在视图类定义之前,添加class CSSplitDoc;设置左侧窗口的合理大小映射单选按钮消息映射3个单选按钮到OnRadio1()中void CDataView:OnRadio1() CSSplitDoc *pDoc=(CSSplitDoc *)GetDocument();U
23、pdateData();pDoc-m_type=m_type;pDoc-UpdateAllViews(this); /this表明不更新自己OnDrawvoid CSSplitView:OnDraw(CDC* pDC)CSSplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);switch(pDoc-m_type)case 0: pDC-MoveTo(50,50); pDC-LineTo(120,120); break;OnDrawvoid CSSplitView:OnDraw(CDC* pDC) case 1: pDC-Rectangle(50,5
24、0,120,120); break;case 2: pDC-Ellipse(50,50,120,120); break;本章主要内容11.2 切分视图11.1 文档/视图结构11.3 文档序列化1、基本概念序列化Serialization,也称为串行化,向永久存储介质写入对象或从存储介质载入对象的过程。对象可以将自身的状态(数据成员)保存到磁盘中,随时可以从磁盘中读取对象的状态并构建该对象。在文档/视结构程序中,序列化是MFC的基本功能,MFC提供了一套完善的机制。基本概念CFile和CArchive磁盘文件的操作封装在CFile中,可以在程序中直接使用CFile进行文件操作。为了配合文档/视结构,MFC并不直接使用CFile,而是使用CArchive类。文档类提供了一个Serialize函数,当我们执行“保存”或“打开”时,会执行Serialize函数,并传入一个CArchive参数,可以将CArchive理解为CFile的缓冲数据对象。CArchive内部保持一个标记,指明是存储还是加载操作。文档类的Ser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏住院医师规范化培训考试(神经内科Ⅰ阶段)题库历年参考题库含答案详解
- 2026正高面审答辩-正高008面审答辩传染病学历年题库含答案详解
- 2026教师职称-辽宁-辽宁教师职称(基础知识、综合素质、高中英语)历年参考题库含答案详解3套试卷
- 药品库存管理系统应用课程设计
- 抽样调查 课程设计
- 基于机器学习的垃圾邮件分类器实战编程课程设计
- 草莓生产课程设计
- 基于Nodejs的实时投票系统视频课程设计
- PCA降维降维算法比较课程设计
- 基于NLP的情感识别系统设计课程设计
- TCCIASC 0025-2024 5G 工厂测评认证规范
- 《风险导向审计方法》课件
- 国家电网企业文化、电力与能源战略题库(含答案)
- 兼职安全员安全培训
- 100以内进退位加减法口算题(20000道 可直接打印 每页100道)
- 可用性控制程序
- 物业电话催费技巧
- 中医内科学痹症课件
- 2022中考作文素材
- 绪论材料分析方法哈工大
- 偏瘫患者的康复锻炼
评论
0/150
提交评论