欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第八章文档视图结构的高级形式.ppt

    • 资源ID:5319678       资源大小:434.03KB        全文页数:131页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第八章文档视图结构的高级形式.ppt

    第八章 文档视图结构的高级形式,在具有文档视图结构的应用程序中,文档数据的初始化、更新、保存等一般由文档类对象完成;视图类对象则提供表示文档数据的人机界面。文档类与视图类对各自任务完成的这种相对独立性与 MFC 应用程序框架带给它们的关联性,造就了文档视图组合形式的多样性,这给应用程序带来了丰富的特性。本章将介绍 SDI、MDI 应用程序文档视图组合的多种形式。,8.1 文档视图结构组合的多种形式8.1.1 MDI 与 SDI 程序的区别 比较 MDI 与 SDI 应用程序的文档视图结构,MDI 应用程序有以下几个特点:可以同时打开多个文档,每个文档有各自的子框架窗口;主窗口的菜单可以随着当前激活的文档类型发生变化;子框架窗口可以进行布局方式(层叠、平铺)等各项操作;子框架窗口可以在 MDI 主窗口区域内定位、改变大小、最大 化和最小化等放置操作,当最大化子框架窗口时,它将占满 MDI 主窗口的全部客户区;,MDI 不仅可以同时打开多个文档,还可以为每个文档同时建 立多个视图。如果在主框架窗口的 Window 子菜单中选择 New 菜单项功能,就为激活的视图窗口复制一个视图窗口。其中,文档的子框架窗口在 MDI 主框架窗口客户区中的定位、改变大小、最大化、最小化和 Window-New 功能都已经成为MDI 应用程序的标准功能,均在主框架窗口类的基类中已经实现,因此,用户一般无需再增加新的操作。每个 MDI 应用程序的主框架窗口是 CMDIFrameWnd 类或其派生类的实例。CMDIFrameWnd 的基类是 CFrameWnd,它除了拥有CFrameWnd 框架窗口类的全部特性外,还具有下列与 MDI 相关的特性:,主框架窗口,文档窗口,客户窗口,主框架窗口并不直接与一个文档和视图相关联。但它拥有一 个子帧窗口(又称为 MDI 客户窗口),当主框架窗口的控制栏(包括工具栏、状态栏以及其他控制栏甚至菜单)显示或隐藏 时,该子帧窗口将重新定位,这一点与 SDI 框架窗口不同。MDI 主框架的客户窗口是 MDI 子框架窗口的直接父窗口,它 负责管理主框架窗口的客户区以及创建子框架窗口。每个 MDI 主框架窗口都有且只有一个 MDI 客户窗口。MDI 子框架 窗口是 CMDIChildWnd 派生类的实例,CMDIChildWnd 的基类也 是 CFrameWnd,作为视图的框架窗口,相当于 SDI 的主框架 窗口。,每打开一个文档,框架就自动为文档创建一个子框架窗口,MDI 应用程序负责动态地创建和删除这些子框架窗口;在任何时刻,最多只有一个子框架窗口是激活的,MDI 主框 架窗口始终与当前激活子框架窗口相关联,命令消息在传给 MDI 主框架窗口之前首先传送给当前激活的子框架窗口。在没有任何激活的子窗口时,主框架窗口使用与主框架窗口 关联的菜单,当有激活子窗口时,主框架窗口的菜单会自动 被与子框架窗口相关联的菜单所替代。主框架窗口的基类为子框架窗口的层叠或平铺排列和新建子 框架窗口等一些标准窗口管理操作提供了菜单命令的响应操 作,因此一般不需要重新定义这类消息的响应函数。,MDI 小结:1.文档视图模板的基本概念 文档模板对象是由子框架窗口类、视图窗口类和文档类的运 行时信息,以及相应的资源 ID 组合而成的;一个应用程序中可以有多个同类或不同类文档模板对象;一个子框架窗口中可以包含一个或多个视图窗口;一个视图对象必须与一个且只与一个文档对象关联;一个文档对象可以与多个不同的视图对象关联;2.文档视图模板实例中各个对象的检索关系 在应用程序类对象中可以检索特定的文档模板对象;在文档模板对象中可以检索特定的文档对象;在主框架窗口对象中可以检索所有显示的子框架窗口对象;在文档对象中可以检索所关联的所有视图对象;,8.1.2 文档视图的多种组合形式 在 SDI 和 MDI 两种应用程序结构中,文档和视图的组合形式可以有多种。这取决于以什么形式、方式把文档展示出来。其中切分窗口和切换视图是以多种视图形式展示文档内容的常用方式。应用程序中的切分窗口具有以下特点:切分窗口一般是定义在 SDI 的主框架窗口或 MDI 的子框架窗 口中,它占据了框架窗口的客户区区域;切分窗口将框架窗口客户区划分为若干窗格,每个窗格定义 为一个视图框架,这些窗格中的视图可以是同一视图类的实 例,也可以是不同视图类的实例;窗格的划分个数和布局由窗口切分种类和窗格的初始化代码 确定,并可以通过鼠标拖动切分隔离条动态调整;,切分窗口是由 MFC 的 CSplitterWnd 类对象实现的。切分窗口 的创建是在框架窗口创建之后,视图窗口创建之前完成的;切分窗口不是应用程序框架的基本类,一般不参加命令消息 传递过程(即一般不安排消息映射和消息处理),而切分窗 口各窗格中的视图类却是命令消息传递过程中的一部分;切分窗口中窗格的一次划分是有限定的,静态切分窗口的窗 格不超过 16X16,而动态切分窗口的窗格不超过 2X2。切换视图就是在不使用切分窗口的情况下,在框架窗口的客 户区轮换显示一个文档的多个视图,从而在同一位置以不同 形式显示文档内容。,综合两种同一文档多视图的显示方式,常见的文档视图的组合形式有:SDI 动态切分窗口应用程序;MDI 动态切分窗口应用程序;SDI 静态切分窗口应用程序;MDI 静态切分窗口应用程序;无切分窗口的 SDI 多视图切换应用程序;无切分窗口的 MDI 多视图切换应用程序本章将通过不同的实例分别叙述各类文档视图的组合形式。,8.2 实例1:动态切分窗口的 SDI 应用程序1 生成新项目 使用AppWizard 生成一个名为“Prog1”的 SDI 应用程序项目。在生成过程中除了进行窗口切分设置(如 所述),其他 各步都可选择默认设置。使用 Visual C+6.0 可在 step 4 of 6 中单击 Advanced 按钮,显 示 Advanced Option 对话框。在 Window Style 属性页中,选中 Use split window 复选框,其他设置保持原有默认选择,这将导 致 AppWizard 在主框架窗口类的定义中添加一个 CSplitterWnd 类对象,并增加创建切分窗口的相应代码。,使用 Visual C+.NET,在项目创建过程中实现上述操作的方法 如下:,2 查看与切分窗口相关的代码 在 CMainFrame 类定义中自动增加了 CSplitterWnd 对象成员,并重新定义了基类的虚函数 OnCreateClient:class CMainFrame:public CFrameWnd protected:CSplitterWnd m_wndSplitter;public:virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext);,在虚函数 OnCreateClient 中实现主框架窗口的切分 该函数在主框架窗口创建之后,创建视图窗口之前被调用,一般在该函数中创建切分窗口和视图窗口。代码如下:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext)return m_wndSplitter.Create(this,2,2,/TODO:adjust the number of rows,columnsCSize(10,10),/TODO:adjust the minimum pane sizepContext);,切分窗口的创建函数原型如下:BOOL Create(CWnd*pParentWnd,/切分窗口的父窗口指针。int nMaxRows,int nMaxCols,/切分窗口的切分行和列。SIZE sizeMin,/窗格显示的最小尺寸。CCreateContext*pContext,/创建切分窗口的场境参数。DWORD dwStyle=WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|SPLS_DYNAMIC_SPLIT,/切分窗口的风格。UINT nID=AFX_IDW_PANE_FIRST);/切分窗口的ID。该函数的功能是创建一个动态的切分窗口。,CMainFrame:OnCreateClient 函数被调用的位置如下框图所示:,创建CMainFrame窗口,在子菜单“查看”(View)中增加了菜单项“分隔”,用于发出 切分命令,其标识值为 ID_WINDOW_SPLIT。MFC 定义了一系 列默认命令,用于调用相应类的标准窗口操作。详细参见 MSDN 的相关部分内容。,3 修改视图类的成员函数 OnDraw 在视图中显示文本串“Visual C+Programming”。void CProg1View:OnDraw(CDC*pDC)CProg1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here CRect rc;GetClientRect(4 编译运行“Prog1”,8.3 实例2:动态切分窗口的 MDI 应用程序1 生成新项目 使用 AppWizard 生成一个名为“Prog2”的 MDI 应用程序项目。在生成过程中除了在 step 4 of 6中进行窗口切分设置(如 所述),其他各步都选择默认设置。设置子框架窗口的切分属性,方法同前。使得子框架窗口类 中添加 CSplitterWnd 类对象,并添加相应的创建切分子框架窗 口的代码。,2 查看与窗口切分相关的代码 在 CChildFrame 中添加了 CSplitterWnd 对象成员,并重新定义 了基类的虚函数 OnCreateClient:class CChildFrame:public CMDIChildWnd DECLARE_DYNCREATE(CChildFrame)protected:CSplitterWnd m_wndSplitter;public:virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext);,在虚函数 OnCreateClient 中实现子框架窗口的切分 该函数在子框架窗口创建之后,创建视图窗口之前被调用,一般在该函数中创建切分窗口和视图窗口。代码如下:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext)return m_wndSplitter.Create(this,2,2,/TODO:adjust the number of rows,columnsCSize(10,10),/TODO:adjust the minimum pane sizepContext);,在子框架窗口菜单的“窗口”(Window)子菜单中添加了菜单项“分隔”,用于发出切分命令,其标识为 ID_WINDOW_SPLIT。,3 修改视图类成员函数 OnDraw 在视图中显示文本串“Visual C+Programming”。void CProg2View:OnDraw(CDC*pDC)CProg2Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here CRect rc;GetClientRect(,4 编译运行“Prog2”,小结:在框架窗口类中增加一个窗口切分类CSplitterWnd的对象成员;重新定义框架窗口类(SDI的主框架窗口,MDI的子框架窗口)的 成员函数OnCreatClient;在OnCreatClient的定义中调用CSplitterWnd:Create完成对框架 窗口类对象的客户窗口的动态切分(至多22),并与文档视图 模板实例的视图对象关联。,8.4 静态切分窗口的多视图 SDI 应用程序 从前面的实例不难看出,动态切分虽然将框架窗口的客户区切分成多个窗格,但每个窗格中只能共用同一视图,这就不能充分体现文档视图提供的多视图特性。这是动态切分窗口的一个特点。下面开始使用切分窗口的另一种形式 静态切分窗口,它的特点是每个窗格中的视图类可以不同。,1 生成新项目 使用 AppWizard 生成一个名为“Prog3”的 SDI 应用程序项目。设置主框架窗口的切分属性,方法同前。使得子框架窗口类 中添加 CSplitterWnd 类对象,并添加相应的创建切分主框架窗 口的代码。修改视图类的基类为 CScrollView,并将缺省的类名修改为 CDigitView,类定义文件名和实现文件名分别修改为 DigitView.h 和 DigitView.cpp。,2 增加文档类数据成员和相应的数据类操作 在文档类 CProg3Doc 中增加一个数组模板类对象数据成员:CArray m_nArray,用于存放一组数据。这组数据将在文档所关联的不同视图中以不同的形式被显示。为了使用数组模板类,必须在 StdAfx.h 中加入相应的系统头 文件:#endif/_AFX_NO_AFXCMN_SUPPORT#include,在 CProg3Doc 类定义中添加数组模板类数据成员 m_nArray 的 定义:class CProg3Doc:public CDocument protected:/create from serialization only CProg3Doc();DECLARE_DYNCREATE(CProg3Doc)/Attributes public:CArray m_nArray;,修改 CProg3Doc 构造函数,加入对 m_nArray 的初始化代码:CProg3Doc:CProg3Doc()/TODO:add one-time construction code here m_nArray.SetSize(10,0);/size and increase of array m_nArray0=3;m_nArray1=4;m_nArray2=8;m_nArray3=20;m_nArray4=12;m_nArray5=17;m_nArray6=11;m_nArray7=7;m_nArray8=9;m_nArray9=6;,修改 CDigitView:OnDraw,显示 m_nArray 所保存数据:void CDigitView:OnDraw(CDC*pDC)CProg3Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here TEXTMETRIC tm;pDC-GetTextMetrics(,3 增加一个视图类 为了实现用直方图(棒图)显示文档数据的目的,需要给文档类 CProg3Doc 添加一个视图类 CBarView。添加一个新类 CBarView,选择它的基类为 CView。为 CBarView 类添加获取文档对象指针的函数 GetDocument,在 CBarView 的定义文件中添加:class CBarView:public CView public:CProg3Doc*GetDocument();,在 CBarView 实现文件添加:#include“Prog3Doc.h”和 GetDocument 的定义代码:CProg3Doc*CBarView:GetDocument()ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CProg3Doc);return(CProg3Doc*)m_pDocument;其中 m_pDocument 是 CArchive 类的一个 CDocument 类型的数 据成员,当使用 菜单命令 File-Open 或 File-New 创建文档 类对象时,m_pDocument 指向新创建的文档类对象。,修改 CBarView:OnDraw,实现用直方图显示 m_nArray 数据:void CBarView:OnDraw(CDC*pDC)CProg3Doc*pDoc=GetDocument();/TODO:add draw code here CRect rc;/create a client area int cBar,cBarSpace;/bar width and space between two bars int x,y;/calculate position of bar drawing int cxGraph=100,cyGraph=20;/logical width,height GetClientRect(,cBar=cxGraph*3/4/10;cBarSpace=cBar/3;pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowOrg(0,0);pDC-SetViewportOrg(10,rc.bottom-10);pDC-SetWindowExt(cxGraph,cyGraph);pDC-SetViewportExt(rc.right-20,-rc.bottom+20);int i;for(x=cBarSpace,y=0,i=0;im_nArray.GetSize();i+,x+=cBar+cBarSpace)pDC-Rectangle(x,y,x+cBar,y+pDoc-m_nArrayi);pDC-SelectObject(poldBr);pDC-SelectObject(poldPen);,代码中关于坐标映射和直方图的绘制可以用下图表示:4 修改框架窗口类 在 CMainFrame 类实现文件中加入:#include DigitView.h#include BarView.h“在 CDigitView 类定义文件中加入:#include Prog3Doc.h,修改 CMainFrame:OnCreateClient 函数 BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext)m_wndSplitter.CreateStatic(this,1,2);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDigitView),CSize(200,0),pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CBarView),CSize(0,0),pContext);return TRUE;,其中切分窗口类的两个成员函数的原型:BOOL CreateStatic(CWnd*pParentWnd,/切分窗口的父窗口指针int nRows,int nCols,/切分窗口的行和列DWORD dwStyle=WS_CHILD|WS_VISIBLE,/切分窗口风格UINT nID=AFX_IDW_PANE_FIRST/切分窗口的ID);virtual BOOL CreateView(int row,int col,/指定窗格的行和列CRuntimeClass*pViewClass,/指定窗格中要创建的指定视图类SIZE sizeInit,/视图显示的初始尺寸CCreateContext*pContext/创建视图的场境);,CMainFrame:OnCreateClient 函数的调用位置如下:5 编译运行“Prog3”发现问题:当 CDigitView 的窗格变小到不能显示全部数据的时候,虽然可以滚动视窗,但不能在垂直方向看到全部数据。,创建CMainFrame窗口,6 修改 CDigitView:OnInitialUpdate:将原来的代码:sizeTotal.cx=sizeTotal.cy=100;SetScrollSizes(MM_TEXT,sizeTotal);修改为如下代码:CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(使视窗中所显示文本的字体的几何尺寸成为视窗滚动操作的依据,从而解决了上述问题。,8.5 静态切分窗口的多视图 MDI 应用程序1 生成新项目 使用AppWizard 生成一个名为“Prog4”的 MDI 应用程序项目。设置子框架窗口的切分属性,方法同前。使得子框架窗口类 中添加 CSplitterWnd 类对象,并添加相应的创建切分子框架窗 口的代码。修改视图类的基类为 CScrollView,并将缺省的类名修改为 CDigitView,类定义文件名和实现文件名分别修改为 DigitView.h 和 DigitView.cpp。,2 添加文档类数据成员和相应的数据类操作 在文档类 CProg3Doc 中增加一个数组模板类对象数据成员:CArray m_nArray,用于存放一组数据。这组数据将在文档所关联的不同视图中以不同的形式被显示。为了使用数组模板类,必须在 StdAfx.h 中加入相应的系统头 文件:#endif/_AFX_NO_AFXCMN_SUPPORT#include,在 CProg3Doc 类定义中加入数组模板类数据成员 m_nArray 的 定义:class CProg4Doc:public CDocument/Attributes public:CArray m_nArray;,修改 CProg4Doc 类构造函数,对 m_nArray 初始化:CProg4Doc:CProg4Doc()/TODO:add one-time construction code here m_nArray.SetSize(10,0);/size and increase of array m_nArray0=3;m_nArray1=4;m_nArray2=8;m_nArray3=20;m_nArray4=12;m_nArray5=17;m_nArray6=11;m_nArray7=7;m_nArray8=9;m_nArray9=6;,3 修改 CDigitView:OnDraw:void CDigitView:OnDraw(CDC*pDC)CProg4Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here TEXTMETRIC tm;pDC-GetTextMetrics(,4 增加 CBarView 类 由于 CBarView 类的定义和实现与实例3中的完全一致,所以可以采用借码法增加 CBarView 类,步骤如下:把实例 3 中的源文件 BarView.h 和 BarView.cpp 复制到本项目 源文件目录中。选择菜单 Project-Add to project-Files命令,在弹出的添加 文件对话框中选择上述两个文件加入本项目,即可完成在项 目中添加 CBarView 的工作。,最后将这两个文件中所有的“Prog3”字串替换为“Prog4”,这 样就使 CBarView 成为与 CProg4Doc 相关联的视图类了。,5 增加一个绘制折线的视图类 CPolyView:除了用数字和直方图形式显示 m_nArray 中的数据外,再增加一种用折线显示数据变化情况的视图,这也是常用的显示数据变化的方式。为此,需要在项目中增加一个绘制折线的视图类CPolyView。使用 ClassWizard 定义 CPolyView,选择该类基类为 CView。在 CPolyView 中添加获取文档指针的成员函数 GetDocument,添加方法和所添加的代码与 CBarView:GetDocument 相似。,修改 CPolyView:OnDraw 函数:void CPolyView:OnDraw(CDC*pDC)CProg4Doc*pDoc=GetDocument();/TODO:add draw code here CRect rc;/create a client area int cLine,cLineSpace;/line length and space between two lines int x,y;/calculate position of bar drawing int cxGraph=100,cyGraph=20;/width and height for logical graph GetClientRect(,cLine=cxGraph*3/4/10;cLineSpace=cLine/3;pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowOrg(0,0);pDC-SetViewportOrg(10,rc.bottom-10);pDC-SetWindowExt(cxGraph,cyGraph);pDC-SetViewportExt(rc.right-20,-rc.bottom+20);int i;x=cLineSpace;y=0;pDC-MoveTo(x,y);for(x=cLineSpace,y=0,i=0;im_nArray.GetSize();i+,x+=cLine+cLineSpace),pDC-LineTo(x+cLine,y+pDoc-m_nArrayi);CPen pen1(PS_DOT,0,RGB(0,0,255);pDC-SelectObject(,6 修改子框架窗口类 CChildFrame:在 CChildFrame 类定义中添加一个 CSplitterWnd 类对象成员 m_wndSplitter1,用于将切分窗口实例 m_wndSplitter 的一个 窗格进行一次新的切分。class CChildFrame:public CMDIChildWnd DECLARE_DYNCREATE(CChildFrame)public:CChildFrame();protected:CSplitterWnd m_wndSplitter;CSplitterWnd m_wndSplitter1;,由于在创建静态切分窗口的代码中需要定义各窗格中的视图 类对象,所以需要在 CChildFrame 的实现文件中加入:#include stdafx.h#include Prog4.h#include DigitView.h#include BarView.h#include PolyView.h#include ChildFrm.h,修改 CChildFrame:OnCreateClient 函数:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext)m_wndSplitter.CreateStatic(this,1,2);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDigitView),CSize(200,0),pContext);m_wndSplitter1.CreateStatic(,函数 OnCreateClient 对子框架窗口的切分过程如下:首先 m_wndSplitter.CreateStatic(this,1,2)在子框架窗口中创建 切分窗口 m_wndSplitter,把子框架窗口的客户区切分为两个 窗格(1行 2 列)。,视图CDigitView,等待继续切分,然后在 m_wndSplitter 的窗格(0,1)中,调用 CreateStatic 创建切 分窗口 m_wndSplitter1,将 m_wndsplitter的窗格(0,1)再次切分 为2行1列。,7 修改 CDigitView:OnInitialUpdate 函数:使得当视图窗口的尺寸小到不能看到所显示的全部数据时,可以通过使用滚动条浏览全部数据。void CDigitView:OnInitialUpdate()CScrollView:OnInitialUpdate();CSize sizeTotal;/TODO:calculate the total size of this view CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(,8 编译运行“Prog4”,小结:在框架窗口类中按切分格式需要增加n个CSplitterWnd的对象成员;重新定义框架窗口类(SDI的主框架窗口,MDI的子框架窗口)的 成员函数OnCreatClient;按照对窗格切分的需要在OnCreatClient的定义中恰当地调用 CSplitterWnd:CreateStatic完成对框架窗口类对象的客户窗口和切分 窗格的再切分(每次至多1616);将每个窗格与不同的视图对象关联,而这些视图对象必须与同一个文 档对象相关联。,8.6 实例5:无切分窗口的多视图 SDI 应用程序 本例的目的是创建一个无切分窗口的多视图切换的 SDI 应用程序。内容是:将一个在文本编辑视图中产生的文本保存在与该编辑视图相关联的文档类对象的字符数组中。同时为该文档定义另一视图,在此视图中将文档中所保存的文本以带有下划线的粗斜体显示出来。文档所绑定的两个视图可以切换显示。,1 生成新项目 使用 AppWizard 生成一个名为“Prog5”的 SDI 应用程序项目。将文档模板字串(Document Template String)修改为:Prog5nnProg5nProg5 文件(*.txt)n.txtnProg5.DocumentnProg5 Document,使得保存文档内容的磁盘文件的默认扩展名为 txt;将视图类的缺省类名 CProg5View 修改为 CNormalView,并将 CNormalView 的基类改为 CEditView,同时将相应的类声明文 件名和实现文件名分别修改为 NormalView.h 和 NormalView.cpp。,2 修改文档类 CProg5Doc:在定义文件中加入视图类头文件:#include NormalView.h 在 CProg5Doc 的定义中加入保存文本的数据成员:public:CString m_szTextBuf;/save contents of text 修改 CProg5Doc 类构造函数:CProg5Doc:CProg5Doc()m_szTextBuf=_T(“”);/set text buffer empty,修改 CProg5Doc:OnNewDocument 和 CProg5Doc:Serialize:BOOL CProg5Doc:OnNewDocument()if(!CDocument:OnNewDocument()return FALSE;(CEditView*)m_viewList.GetHead()-SetWindowText(NULL);/TODO:add reinitialization code here/(SDI documents will reuse this document)m_szTextBuf=_T(“”);/set text buffer empty return TRUE;,void CProg5Doc:Serialize(CArchive,3 修改 CNormalView 视图类 在 CNormalView 类定义文件中加入文档类头文件:#include Prog5Doc.h 为消息 EN_CHAGE 添加反射消息映射和处理函数,以便实时 保存编辑视图窗口中发生了变化的文本。ON_CONTROL_REFLECT(EN_CHANGE,OnChange)void CNormalView:OnChange()CProg5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDoc-m_szTextBuf=LockBuffer();UnlockBuffer();pDoc-SetModifiedFlag();,4 增加一个视图类 CItalicsView 用于斜体加下划线显示文本 定义一个新类 CItalicsView,选择其基类为 CView。在 CItalicsView 类中添加获取文档指针的函数 GetDocument:在 CItalicsView 的类定义文件中加入:#include Prog5Doc.h class CItalicsView:public CView public:CItalicsView();/protected constructor used by dynamic creation CProg5Doc*GetDocument();,在 CItalicsView 的实现文件中添加 GetDocument 的定义代码:CProg5Doc*CItalicsView:GetDocument()/non-debug version is inline ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CProg5Doc);return(CProg5Doc*)m_pDocument;,修改 CItalicsView:OnDraw 函数:void CItalicsView:OnDraw(CDC*pDC)CProg5Doc*pDoc=GetDocument();LOGFONT lf;memset(,CFont*poldFont=pDC-SelectObject(,else if(start TextOut(0,y,pDoc-m_szTextBuf.Mid(start,count-start);start=count;y+=tm.tmHeight+tm.tmExternalLeading;pDC-SelectObject(poldFont);,为命令消息 ID_FILE_NEW、ID_FILE_OPEN、ID_FILE_SAVE 和 ID_FILE_SAVE_AS 定义用户界面更新函数,以便在切换到 CItalicsView 视图时,禁用上述命令。void CItalicsView:OnUpdateFileOpen(CCmdUI*pCmdUI)pCmdUI-Enable(FALSE);void CItalicsView:OnUpdateFileNew(CCmdUI*pCmdUI)pCmdUI-Enable(FALSE);void CItalicsView:OnUpdateFileSave(CCmdUI*pCmdUI)pCmdUI-Enable(FALSE);void CItalicsView:OnUpdateFileSaveAs(CCmdUI*pCmdUI)pCmdUI-Enable(FALSE);,5 修改菜单 在“查看”子菜单中加入用于切换视图命令的菜单项:,6 在 CMainFrame类中增加两个视图类指针成员 在 CMainFrame 类中声明两个视图指针成员:#include NormalView.h#include ItalicsView.h class CMainFrame:public CFrameWnd/Implementation public:CNormalView*m_pNormalView;CItalicsView*m_pItalicsView;,初始化视图指针:CMainFrame:CMainFrame()m_pNormalView=0;m_pItalicsView=0;,7 为菜单命令 ID_VIEW_ITALICS 添加响应函数 void CMainFrame:OnViewItalic

    注意事项

    本文(第八章文档视图结构的高级形式.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开