MFC文档视图.ppt_第1页
MFC文档视图.ppt_第2页
MFC文档视图.ppt_第3页
MFC文档视图.ppt_第4页
MFC文档视图.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MFC文档视图,- 2 -,本章目标,熟悉文档、视图对象的创建过程 熟悉文档/视图结构的消息传递过程 熟悉程序框架中的主要类及相互关系 熟悉文档类、视图类核心函数及作用 熟悉新建、保存和打开的实现的原理 掌握文档/视图程序的界面设计方法, 包括,菜单栏、工具栏、状态栏 掌握文档/视图程序消息处理的方法 掌握文档/视图的文本编程方法,包括插入符创建、显示 掌握通过串行化的方法保存加载对象,- 3 -,文档/视图框架,文档/视图结构是MFC中结构最复杂、体系最庞大而又最富有特色的部分。 在文档/视图结构里,文档是一个应用程序基本数据元素的集合,它构成应用程序所使用的数据单元;视图是应用程序数据显示

2、部分。 使用MFC的程序向导(AppWizard)可以方便的创建文档/视图框架程序。,- 4 -,文档/视图框架文档/视图结构概述,文档和视图的关系,- 5 -,文档/视图框架文档/视图结构概述,使用文档/视图结构的意义: 将数据操作、数据显示和用户界面分离开。这是一种“分而治之”的思想,这种思想使得模块划分更加合理、模块独立性更强。 MFC在文档/视图结构上提供了许多标准操作。如新建文件、打开文件、保存文件、打印等操作,它们被框架自动完成,减轻了程序员的工作量。,- 6 -,文档/视图框架文档/视图结构概述,不宜采用文档/视图结构的情况: 不是面向数据的或数据量很少的应用程序。典型的是一些工

3、具程序,例如磁盘扫描程序、时钟程序。 不使用标准的窗口用户界面的程序。比如游戏程序。,- 7 -,文档/视图框架文档/视图结构概述,单文档与多文档: SDI程序中,用户在同一时刻只能操作一个文档 。 典型应用为Windows下的Notepad记事本程序。在这些应用中,打开新文档时需要关闭当前已打开的活动文档。 MDI程序中,允许用户同时操作多个文档 。 如VS2008就是多文档程序。在MDI程序中,用户可以通过切换活动窗口激活相应的文档进行操作。,- 8 -,文档/视图框架单文档主要类,单文档应用程序框架中,主要包含5个类: SDICWinApp(应用程序类) CFrameWnd(框架窗口类)

4、 CView(视图类) CDocument(文档类) CDocTemplate(类文档模板),- 9 -,文档/视图框架单文档主要类,单文档程序框架中的类对象之间的关系 :,- 10 -,文档/视图框架单文档主要类,SDI框架程序中各对象之间的访问:,- 11 -,文档/视图框架文档视图对象的创建过程,. /注册应用程序的文档模板。 /文档模板将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMytes

5、tDoc), RUNTIME_CLASS(CMainFrame), / 主 SDI 框架窗口 RUNTIME_CLASS(CMytestView); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); /分析标准外壳命令、DDE、打开文件操作的命令行 . /根据命令行中的信息启动程序 . /唯一的一个窗口已初始化,因此显示它并对其进行更新 .,- 12 -,文档/视图框架文档视图核心函数,文档类核心函数 :,- 13 -,文档/视图框架文档视图核心函数,视图类核心函数 :,- 14 -,文档/视图框架文档视图界面设计,在

6、MFC编程中,可以通过三种方法设计界面: 手工代码编程:功能最强大,可以实现几乎所有Windows支持的界面功能; AppWizard:指在用向导生成程序时,通过向导提供的“用户界面功能”初步选择界面元素; 资源编辑器:设计界面更加直观,能实现大部分Windows支持的界面功能,也是最常见的设计界面的一种方法。,- 15 -,菜单编程菜单的概念,- 16 -,菜单编程菜单的开发步骤,简单的菜单编程一般可分为下面三个步骤 : 编辑菜单资源,设置菜单属性(包括菜单名和ID); 通过类的属性化编程自动映射菜单消息; 手工编辑消息映射函数,加入菜单消息处理代码。,- 17 -,菜单编程菜单的创建与编辑

7、,- 18 -,菜单编程菜单消息,MFC程序可以处理两种菜单消息 : WM_COMMAND:菜单命令消息。 UPDATE_COMMAND_UI:在菜单显示前,框架将发送该命令,以方便处理菜单状态的动态变化(例如是否要被设置选中标志、禁止菜单项等)。,- 19 -,菜单编程菜单消息,添加消息映射函数 :,- 20 -,菜单编程菜单消息,添加菜单更新消息:,- 21 -,菜单编程为菜单项设置快捷键,有两种菜单快捷键 : ALT快捷键:在填写菜单的“Caption”属性时用“ /使用CMenu类实例化菜单对象 menu.LoadMenu(IDR_MYPOP_MENU); /加载菜单资源 CMenu*

8、 pMenu = menu.GetSubMenu(0); /0是索引值,这里指顶层菜单的第一项子菜单 ClientToScreen( ,- 25 -,工具栏编程工具栏CToolBar简介,CToolBar类中常用的函数及用途 :,- 26 -,工具栏编程栏编辑和创建工具栏,- 27 -,工具栏编程加载工具栏,工具栏的创建工作是在CMainFrame:OnCreate()函数中完成的:,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . /为窗口创建工具栏 if (!m_wndToolBar.CreateEx(this, TBSTYL

9、E_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) TRACE0(未能创建工具栏n); return -1; / 未能创建 . / TODO: 如果不需要可停靠工具栏,则删除这三行 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); return 0; ,- 28 -,工具栏编程工具栏命令处理,与菜单命令相同,MFC

10、程序可以处理两种工具栏按钮消息:命令消息WM_COMMAND和更新命令消息UPDATE_COMMAND_UI。 通过类的属性窗口可以方便地为工具按钮添加这两种消息的映射函数,其实现过程与菜单项完全相同,- 29 -,状态栏编程CStatusBar类,- 30 -,状态栏编程状态栏创建,CStatusBar m_wndStatusBar;,1. 在CMainFrame类中定义状态栏对象,2.在CMainFrame:OnCreate()函数中创建状态栏,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . if (!m_wndStatus

11、Bar.Create(this) | !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT) TRACE0(未能创建状态栏n); return -1; / 未能创建 . ,- 31 -,状态栏编程状态栏编程,/状态栏窗格数组 static UINT indicators = ID_SEPARATOR, /状态行指示器 ID_INDICATOR_CAPS, /显示Caps Lock键状态 ID_INDICATOR_NUM, /显示Num Lock键状态 ID_INDICATOR_SCRL, /显示Scro

12、ll Lock键状态 ID_INICATOR_CLOCK, /自定义,用于显示时间 ;,状态栏窗格,- 32 -,文本编程创建插入符,void CreateSolidCaret (int nWidth,int nHeight);,1. 创建插入符,2.显示插入符,ShowCaret() ;,3.改变插入符的位置,static void PASCAL SetCaretPos(POINT point);,- 33 -,文本编程字符输入,void CMyNotepadView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: 在此添加消息处理

13、程序代码和/或调用默认值 /存储用户输入的字符 CString str(TCHAR)nChar); GetDocument()-m_strText += str; . /显示字符 dc.TextOut(GetDocument()-m_ptCaretPos.x, GetDocument()-m_ptCaretPos.y,GetDocument()-m_strText); CView:OnChar(nChar, nRepCnt, nFlags); ,窗体响应字符输入的消息是WM_CHAR,消息映射函数的参数nChar即是来自键盘的字符。,- 34 -,串行化串行化概述,串行化是从应用程序中将数据对

14、象写入文件,或从文件中读入到应用程序的数据对象的过程。 串行化的基本思想是将一个类对象成员变量中的当前状态存储,之后也可以通过串行化的读取操作重新创建对象。 在MFC中,能够支持串行化操作的类必须从CObject派生,并且必须重新改写(覆盖)继承自父类CObject的Serialize()函数。,- 35 -,串行化文档/视图结构对串行化的支持,- 36 -,串行化文档/视图结构对串行化的支持,- 37 -,串行化CArchive类,CArchive类没有基类,它提供了一种串行化对象从文件中进行读/写的类型安全的缓冲机制。 使用CArchive对象之前,必须先创建一个CFile对象,同时保证C

15、Archive的读写标志设置(见CArchive构造函数说明)和文件打开方式相一致。 对于一个CArchive对象,可以进行存储操作,也可以读取,但二者不能同时进行。实际的读写操作由与CArchive对象相关联的CFile或派生类对象来执行。 可以把CArchive对象想象成一种二进制流,就像C+中的输入/输出流一样,可以顺序高效的处理二进制对象数据 。,- 38 -,串行化CArchive类,1. 构造CArchive对象,CArchive(CFile* pFile,UINT nMode,int nBufSize = 4096,void* lpBuf = NULL);,- 39 -,串行化C

16、Archive类,2. 和操作符,BYTE bSomeByte; WORD wSomeWord; int iSomeint; . /将数据写入ar对象相关联的文件 ar bSomeByte wSomeWord iSomeint;,- 40 -,串行化CArchive类,3.通过CArchive类串行化CObject派生类对象,/用和pObj;,/当对可串行化的类进行串行化操作时,也可以直接调用Serialize()函数进行 : CTestClass obj; /CTestClass类是可串行化的类,声明对象 . obj.Serialize(ar); /对obj的地址进行操作,将obj写入ar对

17、象相关联的文件 . CTestClass* pObj=new CTestClass; /CTestClass类是可串行化的类,声明指针 /从ar所关联的文件中读取数据信息,并动态创建CTestClass对象给pObj指针 pObj-Serialize(ar);,- 41 -,串行化CArchive类,4.判断CArchive读写状态,/ CMyNotepadDoc 序列化 void CMyNotepadDoc:Serialize(CArchive& ar) if (ar.IsStoring() / TODO: 在此添加存储代码 else / TODO: 在此添加加载代码 ,- 42 -,串行化

18、CArchive类,5.当不再使用CArchive对象时,需要调用CArchive的Close()成员函数关闭CArchive。Close()函数会将缓冲区的所有数据写到文件中,终止和文件的关联。,- 43 -,串行化可串行化的类,使一个类支持可串行化需要经过以下5个步骤: 从CObject类派生,或从CObject派生的某个类派生; 定义不带参数的构造函数; 重写Serialize()成员函数; 使用DECLARE_SERIAL宏,该宏要写在类的定义文件中(一般是在.h文件); 使用IMPLEMENT_SERIAL宏,该宏要写在类的实现文件中(一般是在.cpp文件)。,- 44 -,串行化CObArray和CObList,MFC中的CObArray和CObList类结合了DECLARE_SERIAL和IMPLEMENT_SERIAL宏支持串行化,以转储该集合类中的元素。 这两个集合类都有一个Serialize()函数,要对CObArray和CObList类对象进行串行化,直接在文档类内的Serialize()函数内调用集合类的Serialize()函数即可。,void CDemoDoc:Serializ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论