单文档多视图

合集下载

文档、视图、框架窗口、文档模板之间的相互关系

文档、视图、框架窗口、文档模板之间的相互关系

文档、视图、框架窗口、文档模板之间的相互关系要了解文档、视图、框架窗口、文档模板之间的相互关系,关键要理解他们的结构1、首先应该对 CWinApp类有充分的了解它包含并管理着应用程序的文档/视窗的所有信息。

它有一个成员变量CDocManager * m_pDocManager,此变量是文档/视窗的管理器,m_templateList是CDocManager里的一个列表,此列表里保存了所有文档模板的指针,当用户调用CWinApp::AddDocTemplate( pDocTemplate ) 后该pDocTemplate存入了CWinApp::m_pDocManager::m_templateList里。

CWinApp::GetFirstDocTemplatePosition()CWinApp::GetNextDocTemplate(POSITION& pos)是遍例所有的文档模板指针。

2、上面我们提到了文档模板(CMultiDocTemplate(我们主要针对对文档)),这是一个极重要的类。

CMultiDocTemplate::m_docList保存的所有该种文档的文档实例的指针列表。

下面两个函数用于维护CMultiDocTemplate::m_docList数据CMultiDocTemplate::AddDocument(CDocument* pDoc);CMultiDocTemplate::RemoveDocument(CDocument* pDoc);而CMultiDocTemplate::GetFirstDocPosition() const;CMultiDocTemplate::CDocument* GetNextDoc(POSITION& rPos ) const;用于遍例该文档类型所有文档实例。

3、上面提到文档(CDocument)CDocument 我们最熟悉不过了。

word的5种视图方式

word的5种视图方式

word的5种视图方式
1.页面。

这是Word的默认视图。

一般我们的大部分编辑操作比如新建文档、编辑文档都需要在这种模式下进行。

2.看风景。

这是一种视图模式,旨在方便阅读和浏览文档。

默认情况下,这种模式只保留便于在文档中跳转的导航窗口。

3.写作模式。

对我们来说是一种方便的写作模式。

这种模式很少用!
4.大纲视图。

它在2003版中非常流行,因为它易于查看和调整文档的层次结构,设置标题的大纲级别,并将文本段落移动到块中。

5.网页布局。

这是一个专为浏览和编辑web文档而设计的视图。

在这种模式下,您可以直接看到web文档是如何在浏览器中显示的。

word文档视图设置(word2010的视图方式有哪些)--

word文档视图设置(word2010的视图方式有哪些)--

word文档视图设置(word2010的视图方式有哪些)word怎么切换普通视图北京工商大学如何将页面视图转换为普通视图这是由于显示比例太大所致。

您可以使用以下方法使其恢复正常:选择视图选项卡:,单击按钮;然后单击“确定”。

单击单页按钮;两者都可以使页面显示恢复正常。

方法2:按住键并向下滚动鼠标滚轮以减小显示比例,并使页面显示恢复正常。

页面变得越来越好,如何变得越来越小。

上一个文档旁边有空白,但是现在不见了。

如何将其更改回以前的显示比例?另外,请查看文件页面设置。

边距是否已更改。

文档中的常用视图是什么?文档中的共同观点是什么?在文档中获取图表的最常见方法是书访方法。

共有五种类型:页面视图(最常用),普通视图,大纲视图,布局视图和阅读布局视图。

如何在参考中创建目录,选择目录,设置设置后,将自动编译目录。

提示:如果要拥有一个好的目录,则必须预先设置每个段落的格式。

步骤1.自动生成目录准备:近似索引。

如果要自动生成目录,则必须首先建立系统可以识别的轮廓索引。

这是自动生成目录的前提。

选择您的标题。

在开始选项卡中,选择格式,然后选择所需的目录格式结构。

选择后,将建立大纲索引,同时,它将具有默认的标题格式。

,以同样的方式,我们逐级设置标题,标题和其他目录结构索引。

以同样的方式,我们为整个文档中的所有标题构建了大纲索引。

第二步,自动生成和更新目录,已经进行了必要的准备,然后我们开始生成目录。

首先,将光标定位到目录的存储位置,然后单击自动引用目录或选项卡上的。

,目录将自动生成。

,如果您更新多篇文章或调整目录结构,则需要更新目录,单击目录,右键单击下拉菜单-更新字段。

,建议选择更新整个目录,以免丢失。

单击确定进行更新。

自定义目录格式调整如果您对系统的默认目录格式不满意,需要对其进行自定义,则也可以。

单击参考目录,以插入目录。

可以设置许多目录格式选项,例如是否显示页面,页面是否向右对齐,显示选项卡以及显示多个级别。

C++MFC教程

C++MFC教程

第1章Visual C++基础本章首先介绍了Visual C++ 6.0的安装,然后讨论了应用程序向导、类向导,以及文档视图结构、IDE、辅助工具等几方面的内容。

应用程序向导和类向导实际上是IDE的一部分,由于特别重要,故单独列出。

辅助工具讲的是第三方开发的辅助工具,它是集成开发环境的补充,有了它,编写程序将更加轻松快捷。

本章还将针对各个难点提供多个简单而实用的例子,可以帮助读者快速学习并掌握Visual C++开发基础。

1.1.1 Visual C++ 6.0的安装1.1.2 应用程序向导1.1.3 类向导1.1.4 文档视图结构1.1.5 IDE1.1.6 辅助工具1.2.1 新建工作空间1.2.2 增加消息映射项1.2.3 关联成员变量1.2.4 调试技巧1.2.5 单文档多视图1.2.6 多文档示例1.3.1VC项目文件说明1.3.2IDE使用技巧1.3.3常见问题1.1.2 应用程序向导使用应用程序向导可以快速生成程序框架。

选择菜单“File→New”命令,此时会弹出“New”对话框,下面对该对话框中的常用选项进行逐一说明。

1.文件(Files)属性页单击“Files”标签,打开“Files”属性页,如图1-3所示。

图1-3 文件属性页文件类型虽然多,但常用的只有两种:C/C++ Header File(C/C++头文件)和C/C++ Source File (C/C++源文件)。

新建一个文件,可以按照以下步骤操作。

(1)选择合适的文件类型。

(2)如果想把新文件加入到工程内,选中“Add to project”复选框,并在下面的组合框中选择合适的工程。

如果当前没有打开任何工程,“Add to project”会被禁用。

(3)在“File”编辑框中输入合适的文件名。

(4)在“Location”编辑框中输入文件存放位置。

2.工程(Projects)属性页单击“Projects”标签,弹出“Projects”属性页,如图1-4所示。

MFC多文档多视图编程

MFC多文档多视图编程

深入了解MFC中的文挡/视结构李泽宇金刚熊联欢姜军(华中理工大学图象识别与人工智能研究所)Visual C++ 5.0 以其功能强大、用户界面友好而倍受程序员们的青睐。

但是,在当前的Microsoft 基本类库4.2 版本中,大约有将近200 个类,数千个函数,加之Microsoft 公司隐藏了一些技术细节,使得人们深入学习MFC变得十分困难。

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用、单文档应用(SDI)和多文档应用(MDI)。

前两者的结构较简单,本文不再赘叙。

笔者拟从MFC中的文档/视结构入手,分析一些函数的流程,并解决编制MDI 应用程序过程中的一些常见问题。

(一)、了解文档/视结构MFC应用程序模型历经多年以有了相当大的发展。

有一个时期,它只是个使用应用程序对象和主窗口对象的简单模型。

在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中,在框架窗口的客户区中,该数据被提交显示器。

随着MFC2。

0的问世,一种应用程序结构的新方式----MFC文档/视结构出现了。

在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。

一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:。

应用程序是一个CwinApp派生对象,它充当全部应用程序的容器。

应用程序沿消息映射网络分配消息给它的所有子程序。

框架窗口是一CfrmeWnd派生对象。

文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分。

视窗是Cview派生对象,它与其父框架窗口用户区对齐。

视窗接受用户对应用程序的输入并显示相关联的文档数据。

通常,应用程序数据存在于简单模型中的框架窗口中。

在文档/视方式中,该数据移入称为document 的独立数据对象。

当然,文档不一定是文字,文档是可以表现应用程序使用的数据集的抽象术语。

而用户输入处理及图形输出功能从框架窗口转向视图。

如何在MFC单文档中创建多视图

如何在MFC单文档中创建多视图

u 一个文档可以有多个视图,由Document中成员变量CPtrList m_ViewList维护。
u CFrameWnd拥有一个成员变量CView* m_pActiveView指向当前活动的View。
u CView中拥有一个成员变量CDocument* m_pDocument指向该视图相关的Document。
!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) ||
!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) ||
/wang_qingyuan/blog/item/60870400275c5b087bec2cbd.html
深入分析MFC文档视图结构
2008-10-16 19:40
文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过Windows SDK Programming 的学习和经历就直接进行MFC Programming的学习和开发,更是面对一堆的代码不知所措。

MFC的窗口分割实例以及CSplitterWnd类

MFC的窗口分割实例以及CSplitterWnd类
在 MFC 的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了 增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所 有视图的方法(UpdateAllViews)。通过多文档框架的窗口复制机制和单文档框架的分割窗 口机制是实现单文档多视图的主要方法。
3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。

c++考试题

c++考试题

VC习题1下列对于WinMain函数的描述中,错误的是()。

A)WinMain函数的名称是固定的B)WinMain函数是Windows程序的入口点C)WinMain函数不能有参数D)窗口函数与WinMain的关联是通过窗口类的注册实现的以下四个特性中哪一个不属于面向对象的三大特性()。

A)封装性B)多态性C)抽象性D)继承性下列关键字中哪一个不是用于类的访问控制的()。

A)public B)friend C)private D)protected下面四个MFC类中哪一个是管理MFC应用程序的()。

A)CWinApp B)CMainFrame C)CDocument D)CView下列类中不属于MFC框架基本类的是()。

A)CWinApp B)CFrameWnd C)CView D)CObject传统的软件开发主要采用过程驱动的方法,而Windows程序的开发使用消息驱动模型,该模型靠事件机制来实现其功能。

主框架类是应用程序中负责控制菜单、工具栏和状态栏等界面元素的最主要的类。

命令视图类文档类文档模板类框架窗口类应用程序类VC习题2VC开发环境可以生成的基于MFC appwizard的应用程序类型有单文档/视图结构、多文档/视图结构和基本对话框。

包含类定义的文件称为头文件,包含类中成员函数实现代码的文件称为源文件,包含资源信息的文件称为资源文件。

ResourceView的主要功是编辑当前工程中的资源。

应用程序向导的主要功能是帮助生产应用程序。

类向导的主要功能是管理各个类中的消息。

项目工作区窗口一般在开发环境的左侧,它包含工程的多个方面,分别是classview 、fileview 和resource view 。

项目工作区文件的扩展名为.dsw 。

VC习题3下列选项中哪一个不是命令消息的触发途径:单击对话框中的按钮。

Windows应用程序的消息来源主要包括输入消息、控制消息和系统消息、用户消息。

发送消息可以采用的两个函数是postmessage 和sendmessage 。

单文档与多文档

单文档与多文档

这一点与Windows消息 这一点与Windows消息 Windows 和控件通知消息不同, 和控件通知消息不同, 因为Windows Windows消息和控 因为Windows消息和控 件通知消息就只能被 窗口和视图处理. 窗口和视图处理.
文档/视图结构的工作机制 文档 视图结构的工作机制
视图通过GetDocument 视图通过GetDocument 成员函数获得指向相关 联的文档对象的指针 通过该指针调用文 档类的成员函数来 从文档中读取数据
16.3 CDocument类的派生类构造 类的派生类构造
构造CDocument类的派生类的基本步骤 类的派生类的基本步骤 构造 一般来说, 一般来说,从CDocument类派生自己的文档类所需的典型步骤为 类派生自己的文档类所需的典型步骤为 为每一个文档类型从CDocument类(当然也可以是其它 类 当然也可以是其它 为每一个文档类型从 CDocument类的派生类 派生一个相应的文档类. 类的派生类)派生一个相应的文档类 类的派生类 派生一个相应的文档类. 为文档类添加成员变量.这些成员变量用来保存文档的 为文档类添加成员变量. 数据,其它对象 如与文档相关联的视图 如与文档相关联的视图)直接或间接地访 数据,其它对象(如与文档相关联的视图 直接或间接地访 问这些成员变量来读取或更新文档的数据. 问这些成员变量来读取或更新文档的数据. 重载Serialize成员函数,实现文档数据的串行化. 成员函数,实现文档数据的串行化. 重载 成员函数
视图结构中 在文档/视图结构中 文档 视图
在文档和用户之 间起中介作用 除WM_COMMAND外,文档不 WM_COMMAND外 文档不 处理其它的Windows Windows消息 能处理其它的Windows消息 视图可以直接或间接 地访问文档类中的成 员变量, 员变量,它从文档类 中(而不是从存储介质 而不是从存储介质 中)将文档中的数据取 将文档中的数据取 出来, 出来,然后在屏幕上 显示文档的数据

VS2022-MFC编程入门

VS2022-MFC编程入门

VS2022-MFC编程入门鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。

但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。

鸡啄米在这套VS2022/MFC编程入门教程中将会给大家讲解怎样使用VS2022进行可视化编程,也就是基于窗口的程序。

C++编程入门系列主要偏重于理论方面的知识,目的是让大家打好底子,练好内功,在使用VC++编程时不至于丈二和尚摸不着头脑。

本套教程也会涉及到VC++的原理性的东西,同样更重视实用性,让大家学完本套教程以后,基本的界面程序都能很容易编写出来。

VC++简介VC++全称是ViualC++,是由微软提供的C++开发工具,它与C++的根本区别就在于,C++是语言,而VC++是用C++语言编写程序的工具平台。

VC++不仅是一个编译器更是一个集成开发环境,包括编辑器、调试器和编译器等,一般它包含在ViualStudio中。

ViualStudio包含了VB、VC++、C#等编译环境。

当然我们在使用VC++6.0的时候为了轻便,总是只单独安装VC++6.0。

但自微软2002年发布以来,微软建立了在.NET框架上的代码托管机制,一个项目可以支持多种语言开发的组件,VC++同样被扩展为支持代码托管机制的开发环境,所以.NETFramework是必须的,也就不再有VC++的独立安装程序,不过可以在安装ViualStudio时只选择VC++进行安装。

VC++版本的选择:VS2022因为VC++6.0以后的版本不再有独立的安装程序,所以鸡啄米在教程中将不会称VC++6.0以后的版本为VC++7.0等等,而是用VC++所属的ViualStudio的版本名称代替,比如VS2003。

近些年VC++主要的版本包括:VC++6.0、VS2003、VS2005、VS2022和VS2022。

VC++6.0占用的系统资源比较少,打开工程、编译运行都比较快,所以赢得很多软件开发者的青睐。

如何在MFC单文档中创建多视图

如何在MFC单文档中创建多视图

如何在MFC单文档中创建多视图如何在MFC单文档中创建多视图基本步骤如下:1.首先创建一个MFC单文档应用程序。

2.添加4个MFC类TopLView、BottomLView、T opRView、BottomRView,基类为CView。

3.添加一个MFC类CControlForm,基类为CFormView,对话框ID默认。

4.创建一个切分类,如MySplitter,基类为CSplitterWnd(默认基类选项中无此类,自己添加即可)。

5.在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作)。

6.重写框架类Cmainframe的OnCreateClient函数,如下://第一次静态切分CreateStatic,一行两列if (!m_wndSplitter.CreateStatic(this,1,2))return FALSE;//第二次静态切分(将第一次切分后的第二列再分为2*2)及所有的子视图创建(CreateView函数)。

if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) || !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD |WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1))|| !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) || !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) || !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) || !m_wndSplitter2.CreateView(1, 1,RUNTIME_CLASS(BottomRView), CSize(350, 240), pContext)) {m_wndSplitter.DestroyWindow();return FALSE;}// return CFrameWnd::OnCreateClient(lpcs, pContext); //注释掉原有的响应函数注意:记得在Mainfrm.h中添加以上五个视图类的头文件:#include "CControlForm.h"#include "T opLView.h"#include "T opRView.h"#include "BottomLView.h"#include "BottomRView.h"6. 切分视图完成,结果如下:其中,最左的视图为FormView类型,操作类似对话框(可以在Resource-Dialog看到其对应的对话框资源);右边四个的操作则类似普通视图。

VC++讲义第16单元 多文档视图结构

VC++讲义第16单元  多文档视图结构

第16单元多文档界面程序本单元教学目标介绍多文档界面(MDI)程序的构造和编程方法。

学习要求理解多文档界面(MDI)程序的构造,掌握其编程方法。

授课内容和框架窗口界面程序、单文档界面(SDI)程序和基于对话框的应用程序一样,多文档界面(MDI)程序也是基本的MFC应用程序结构。

MDI程序的结构最复杂,功能也最强。

其特点是用户一次可以打开多个文档,每个文档均对应不同的窗口;主窗口的菜单会自动随着当前活动的子窗口的变化而变化;可以对子窗口进行层叠、平铺等各种操作;子窗口可以在MDI主窗口区域内定位、改变大小、最大化和最小化,当最大化子窗口时,它将占满MDI主窗口的全部客户区。

MDI不仅可以在同一时间内同时打开多个文档,还可以为同一文档打开多个视图。

16.1MDI应用程序从程序员角度看,每个MDI应用程序必须有一个CMDIFrameWnd或其派生类的对象,该窗口称作MDI框架窗口。

CMDIFrameWnd是CFrameWnd的派生类,除了拥有CFrameWnd 类的全部特性外,还具有以下与MDI相关的特性:1.与SDI不同,MDI的框架窗口并不直接与一个文档和视图相关联。

MDI的框架窗口拥有客户窗口,在显示或隐藏控制条(包括工具条、状态栏、对话条)时,重新定位该子窗口。

2.MDI客户窗口是MDI子窗口的直接父窗口,它负责管理主框架窗口的客户区以及创建子窗口。

每个MDI主框架窗口都有且只有一个MDI客户窗口。

3.MDI子窗口是CMDIChildWnd或其派生类对象,CMDIChildWnd也是CFrameWnd 的派生类,用于容纳视图和文档,相当于SDI下的主框架窗口。

每打开一个文档,框架就自动为文档创建一个MDI子窗口。

一个MDI应用程序负责动态的创建和删除MDI子窗口。

在任何时刻,最多只有一个子窗口是活动的(窗口标题栏颜色呈高亮显示)。

MDI框架窗口始终与当前活动子窗口相关联,命令消息在传给MDI框架窗口之前首先分派给当前活动子窗口。

第11章单文档与多文档

第11章单文档与多文档

中(而不是从存储介质 这一点与Windows消息
中)将文档中的数据取 和控件通知消息不同,
出来,然后在屏幕上 因为Windows消息和控
显示文档的数据
件通知消息就只4能被 窗口和视图处理。
文档/视图结构的工作机制
视图通过GetDocument 成员函数获得指向相关 联的文档对象的指针
通过该指针调用文 档类的成员函数来 从文档中读取数据
无论是保存文档或是打开文档,应用程序都是通过 调用文档类的Serialize串行化成员函数来完成操作的。 因此,在大多数情况下,我们都需要重载Serialize成员 函数。Serialize成员函数带有一个CArchive类型的参数, 这是一个与所打开的文件相关联的对象。一般情况下, 总是使用CArchive对象来保存和打开文档。
由于每一个文档可以有多个视图,但 每个视图只能对应于一个确定的文档
多文档程序需要解决的问题仅仅是多 个文档的数据管理方法的问题
多文档程序,最初的文档模板只支持主窗口,但每次打开一 个新文档时都调用CDocument的函数OnNewDocument,建 立一个由CMDIChildWnd派生的新的MDI子窗口,这些窗口 中保存着各种已打开的文档,所有的细节都由MFC库处理 3
建的。
每一种文档类型都有一种文档模板与之相对应,文档模
板负责创建和管理该文档类型的所有文档。
文档模板的构造函数的原型如下:
CDocTemplate
(UINT nIDResource, //与文档一同使用的各种资源的资源标识符 CRuntimeClass* pDocClass,// 指向文档派生文档类的对象的指针 CRuntimeClass* pFrameClass, //框架类的派生框架类的对象指针 CRuntimeClass* pViewClass //指向CView的派生视图类的对象指针

基于Visual C++单文档多视图程序设计方法

基于Visual C++单文档多视图程序设计方法

u l + + 的类 向 导 不 提 供 谈 种 功 能 而 需 要 手 动 添 加 代 码 时 的 疑 难 问 题 , 在 Vi a c + 环 ac 使 s l+ u
境 中嫡制 单文档 多视 图的应 用程序得 0应手 。 关键词 : s a c Vi l ++ ; u 单文档 多视 图 ; C MF 中圈分类号 :P 97 T 3: 2 文献标识码: A 文章编号 : 0—2l(02O —o5一O 1 8 612o}l o 3 3 0
Ke r s ywod :Viu l s a + ;ig ed c me t/ l — iw ̄ F C+ sn l o u n mu t ve M C i
在开 发应用软 件 的 时候 发 现 , 多 时候需 要 的是 很 单 文档多 视图 的应 用 程 序 , V sa c + 的应 用 程 而 iu l +
寰 1 加^

I DC STATI C
_
1 示 例 程序 的功 能
本 示例程序 是一个 典 型的单文档 多 视 图程序 。在 DrwVi 视 图中按下 鼠标左键 处 画一 个封 闭 的椭 圆 a e w
或 者 一 个 封 闭 的矩 形 . 过相 关 的 菜 单命 令 切 换 到 通 F r e 视 图 中可 在 x与 Y 编辑 框 以及 S ae下 omVi w hp
收 稿 日期 } 0l 1— 0 Z0 一 0 9

作 者 简 介 t 力 (9 9 , . 江 16 一) 男 瑚南 束 阳 市人 , 洲工 学 院 讲 师 . 士 t 株 硕 主要从 事计 算 机 田 形 与 罔 象 处 理研 究
维普资讯
J n 2 0 a .0 2
基于Vs l ++ 单文档多视图程序设计方法 iaC u

在View类中创建分割多视

在View类中创建分割多视

本文在介绍了几种标准的单文档与多视结构的VC5.0 MFC实现方法之后,介绍了笔者摸索出的另外两种实用方法,并给出了实现它们的的主要程序框架。

一、单文档与多视Windows程序一般分为以下几种风格:多文档、单文档、基于对话框的。

Word一类多文档程序和计算器一类基于对话框的程序不在本文介绍之列。

单文档又分为单视的和多视的。

一般情况下,单文档仅需要单视就够了,如画笔等。

但也有一些情况下,单文档需要多视支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。

在MFC的框架下,文档对象(CDocument)维持了一个保存其所有视的列表,并提供了增加与删除视的函数,以及当文档内容改变时通知其所有视的方法。

通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视的主要方法。

但这些标准方法在有的情况下并不够用,为此笔者摸索出另外两种实用的方法,在实践中使用效果良好。

二、三种标准的单文档与多视情况1.视对象基于同一视类,每个视位于MDI的一个独立子文档框架中。

用户可以通过“窗口\新窗口”菜单,为同一文档的视再创建一个窗口,通过新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实现同步,用户修改一个视的内容,在另外的视中也自动更新。

MFC框架通过复制原来的子框架窗口和其中的视来实现上面的功能,并且是完全自动的。

2.视对象基于同一视类,所有视位于同一文档框架中。

分割窗口将单文档窗口的视区分割成几个独立的视,框架从同一视类创建多个视对象。

Word的子窗口即属于这种类型。

3.视对象基于不同的视类,所有的视位于同一文档框架中。

多个视共享同一文档框架,但从不同的视类创建,每个视可以为文档提供不同的观察和编辑方法。

比如一个视用图形观察文档,而另一个视用文本编辑文档中对象的属性。

这种情况也适应于用不同的视来观察文档的不同部分。

这种类型的实现方法是通过重载OnCreateClient函数实现。

Word2010中5种视图模式的作用

Word2010中5种视图模式的作用

Word2010中5种视图模式的作用
在Word2010中提供了多种视图模式供用户选择,这些视图模式包括“页面视图”、“阅读
版式视图”、“Web版式视图”、“大纲视图”和“草稿视图”等五种视图模式。

用户可以在“视图”功能区中选择需要的文档视图模式,也可以在Word2010文档窗口的右下方单击视图
按钮选择视图。

1.页面视图
1.“页面视图”可以显示Word2010文档的打印结果外观,主要包括页眉、页脚、图形对象、分栏设置、页面边距等元素,是最接近打印结果的页面视图,如图1所示。

2.阅读版式视图“阅读版式视图”以图书的分栏样式显示Word2010文档,“文件”按钮、功能区等窗口元素被隐藏起来。

在阅读版式视图中,用户还可以单击“工具”按钮选择各种阅读工具,如图2所示。

3.Web版式视图“Web版式视图”以网页的形式显示Word2010文档,Web版式视图适用于发送电子邮件和创建网页,如图3所示。

4.大纲视图“大纲视图”主要用于设置Word2010文档的设置和显示标题的层级结构,并可以方便地折叠和展开各种层级的文档。

大纲视图广泛用于Word2010长文档的快速浏览和设置中,如图4所示。

5.草稿视图“草稿视图”取消了页面边距、分栏、页眉页脚和图片等元素,仅显示标题和正文,是最节省计算机系统硬件资源的视图方式。

当然现在计算机系统的硬件配置都比较高,基本上不存在由于硬件配置偏低而使Word2010运行遇到障碍的问题,如图2009120205所示。

单文档实现多视图

单文档实现多视图
Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
void CMultiViewApp::OnShowFirstview()
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd,GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));

单文档多视图中鹰眼图的实现

单文档多视图中鹰眼图的实现

用软 件的开发 中实现 了鹰眼 图的功能。在具体的开发过程 中通过对鹰 眼图实现方 法的 分析 , 运用 了函数 间相 互调 用的方法来具体 实现 。解决 问题的方法具有很高的 实用性和通用性。 关键 词 : p Ma X控件 ; sa C++. T; 1拆 分; Vi l u NE 窗 : 2 鹰眼图
m—a l p Moe n o 0 0 C , , R E) e MaX. vWidw( , ,X c T U ; g y
12 5 在 类 向 导 中 为 rS S s 肌 vi ., I ryt 三 e e w创 建 wM— C ET 、 R A E wM— I 和 wM— E F C SZ E S T O US的处理 消息 , 分 别添加如下代码 :
m—  ̄MaX.e ou( ; c l p S t cs) F
它情况下为显示鹰眼图而增加 的冗余程序代码 , 而减少程 从 序代码 的编辑 , 降低 工作量 , 快工程 进度。下 面给 出具体 加
的实现方法。
编译运 行 程序 , 以看 到项 目的初 始框 架 已经 完 成。 可 ( 如图 l 所示 ) 在视 图窗 口中, 下角是鹰 眼图 , 上角是主 左 右
维普资讯
山西 电子技 术
20 0 8年第 3期
软 件 天地
单 文档 多视 图 中鹰 眼 图的 实现
侯峥峰 熊 辉
( 国防科技 大学电子科 学与工程学院, 湖南 长沙 40 7 ) 10 3
摘 要: 利用 MaX控件结合面向对象程序 设计语言 Vi aC++. E p sl u N T在一个小型电子信 息综合测试 系统应





20 0 8年

windows程序设计实验报告

windows程序设计实验报告

河南理工大学测绘学院《Windows程序设计》实验报告班级_地信10-1_姓名_薛山_学号311005030124__实验态度:1、认真2、良好3、一般4、不认真实验成果:1、优秀2、可信3、一般4、不真实实验报告:1、清晰完整2、比较完整3、不清晰成绩_________________教师签字_________________交报告日期: 2012 年月日实验项目一:w i n d o w s A P I编程一、实验目的:1、了解windows32 API编程的基本程序框架与编程方法。

2、掌握几个主要API函数的功能。

3、利用VC++6.0的编译环境编写C语言下的windows程序的步骤和利用其资源管理和编译器建立windows资源的方法。

4、API编程对windows消息的处理有利于MFC下的windows编程的理解。

二、练习和总结:1、谈谈你对windows程序事件驱动机制的理解并对windows API编程的主要步骤作简单说明。

一、在VC++6.0环境中建立工程。

1、选择文件菜单中的new,然后在projects选项下选择win32application项目,设定好文件路径和工程名称,选择生成一个空工程,点击完成。

2、在工程中新建一个.c或.cpp源码文件,主要就是建立一个简单的windows API编程的界面。

注意:该步操作中只要将老师给的代码按照老师给的实验步骤粘贴在.c或.cpp源码文件下就可以了,然后编译运行该程序,可看到程序界面:请注意分析WinMain()函数的代码各部分的主要工作。

窗口没有加载菜单和图标资源,背景为灰色,这都可通过窗口类的下面几项设置中选择资源并加以设置:wndclass.hIcon = LoadIcon(NULL, "IDI_APPICON"); wndclass.hCursor = LoadCursor(NULL, "IDC_ARROW");wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndclass.lpszMenuName = NULL;另外,窗口的风格设置也可通过设置函数CreateWindow(…)的第三个参数来加以设置。

第9章 单文档界面和多文档界面1

第9章 单文档界面和多文档界面1

2011-12-1
2
9.1 文档对象和视图对象
文档和视图的关系
文档用于数据处理和维护, 视图则用于数 文档用于数据处理和维护,而视图则用于数 数据处理 据的显示 在文档/视图结构的应用程序编程中 显示, 视图结构的应用程序编程中, 据的显示,在文档 视图结构的应用程序编程中, 主要的工作就是用代码操作文档对象 视图对象。 操作文档对象与 主要的工作就是用代码操作文档对象与视图对象。 在关于文档对象与视图对象的代码中一般要 调用方法Cview::GetDocument(),通过 调用方法 , GetDocument()可以返回指向联系的视图对象, 可以返回指向联系的视图对象 可以返回指向联系的视图对象, 一般地,当视图为人机交互界面时, 一般地,当视图为人机交互界面时,如果用户在 视图中对文档数据进行编辑, 视图中对文档数据进行编辑,视图将接收到此消 再发送消息通知文档对象更新文档数据, 息,再发送消息通知文档对象更新文档数据,这 时可用GetDocument()得到被操作的文档对象。 得到被操作的文档对象。 时可用 得到被操作的文档对象
2011-12-1
பைடு நூலகம்
5
习题
1.MFC中文档和视图的关系是什么? . 中文档和视图的关系是什么? 中文档和视图的关系是什么 2.文档的主要作用是什么? .文档的主要作用是什么? 3.视图的主要作用是什么? .视图的主要作用是什么?
2011-12-1
6
第9章 单文档界面和多文档界面 章
内 容 提 要
1
文档对象和视图对象
2
单文档界面
3
多文档界面
2011-12-1
1
9.1 文档对象和视图对象
文档对象:文档对象用于存储程序数据, 文档对象 文档对象用于存储程序数据,在 文档对象用于存储程序数据 应用程序中,要使数据存放到文档对象中, 应用程序中,要使数据存放到文档对象中, 就应将存储的数据作为文档对象的成员变 的文档类由Cdocument类所派生。 量。MFC的文档类由 的文档类由 类所派生。 视图对象:显示文档数据以及接受用户的输 视图对象 显示文档数据以及接受用户的输 入和编辑, 入和编辑,视图对象的一个非常重要的成 函数, 员函数是OnDraw()函数,每当窗口需要重 员函数是 函数 画时就将调用此函数, 画时就将调用此函数,MFC的视图类由 的视图类由 Cview类所派生。 类所派生。 类所派生
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

相信这就是vc的弊病吧!项目作了很久发现应该用多视图,可是刚开始建立工程的时
候考虑不周阿,没办法,只能从网上搜了,竟搜到了一个不错的函数可以解决这个问题:void CMainFrame::SwitchToView(int nForm)
{
//CDocument* pDoc = GetActiveDocument();
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
if(pNewActiveView==NULL)
{
switch(nForm) //这些ID是对话框的标志符,但也可以用其他的标志
{
case IDD_PLANT_VIEW :
pNewActiveView=(CView*)new CPlantView;
break;
case IDD_HSUB_VIEW :
pNewActiveView=(CView*)new CHSubView;
break;
}
CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,WS_BORDER|WS_CHILD,CFrameWnd::rectDefault,this,nForm, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOWMAXIMIZED); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图
pNewActiveView->GetDocument()-SetTitle(\"。

\");
if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CHSubView))
pOldActiveView->SetDlgCtrlID(IDD_HSUB_VIEW);
else
if(pOldActiveView-GetRuntimeClass() ==RUNTIME_CLASS(CPlantView))
pOldActiveView-SetDlgCtrlID(IDD_PLANT_VIEW);
pNewActiveView-SetDlgCtrlID(AFX_IDW_PANE_FIRST);
delete pOldActiveView; //删除旧视图
RecalcLayout(); //调整框架窗口
};
这个函数很好用大家可以参考一下。

其中IDD_HSUB_VIEW 等都是新建立的FormView,也就是继承了CFormView类的新类。

注意将各个新类中的构造函数改成public,才能用此函数不出错。

由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。

内容如下:
单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:
分栏多视图切换:
Code:
1.BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SI
ZE size)
2.{
3. CCreateContext context;
4. BOOL bSetActive;
5.
6.if ((this->m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
7.return FALSE;
8.
9.//获取文档对象的指针,以便在创建新视图的过程中能够使用它
10. CDocument * pDoc= ((CView *)m_wndSplitter.GetPane(row,col))->GetDocument
();
11.
12. CView * pActiveView=this->GetActiveView();
13.if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))
14. bSetActive=TRUE;
15.else
16. bSetActive=FALSE;
17.
18. pDoc->m_bAutoDelete=FALSE; //设置标志,这样当视图销毁时不会删除文档
19. ((CView *) m_wndSplitter.GetPane(row,col))->DestroyWindow(); //删除存在
的视图
20. pDoc->m_bAutoDelete=TRUE; //设回默认的标志
21.
22.//创建新视图
23. context.m_pNewViewClass=pViewClass;
24. context.m_pCurrentDoc=pDoc;
25. context.m_pNewDocTemplate=NULL;
26. context.m_pLastView=NULL;
27. context.m_pCurrentFrame=NULL;
28. m_wndSplitter.CreateView(row,col,pViewClass,size, &context);
29.
30. CView * pNewView= (CView *)m_wndSplitter.GetPane(row,col);
31.
32.if (bSetActive==TRUE)
33.this->SetActiveView(pNewView);
34.
35. m_wndSplitter.RecalcLayout(); //重新计算位置
36. pNewView->OnInitialUpdate(); //调用初始化函数
37.return TRUE;
38.}
无分栏多视图切换
Code:
1.BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)
2.{
3. CCreateContext context;
4.
5. CDocument *pDoc = GetActiveView()->GetDocument();
6.
7.//销毁先前的视图窗口
8. pDoc->m_bAutoDelete = FALSE;
9. GetActiveView()->DestroyWindow();
10. pDoc->m_bAutoDelete = TRUE;
11.
12.//创建新视图
13. context.m_pNewViewClass = pViewClass;
14. context.m_pCurrentDoc = pDoc;
15. context.m_pNewDocTemplate = NULL;
16. context.m_pLastView = NULL;
17. context.m_pCurrentFrame = NULL;
18. CView *pNewView = (CView *)this->CreateView(&context);
19.
20.//设置新视图为活动状态
21.this->SetActiveView(pNewView);
22. RecalcLayout();
23.
24.//初始化新视图
25. pNewView->OnInitialUpdate();
26.
27.return TRUE;
28.
29.}
两种情况的原理一样,差别只在创建新视图后视图指针的获取。

一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。

例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:
Code:
1.//获得主窗口指针
2.CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();
3.//切换视图
4.pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));
OK,这样就好了,希望以上内容与你有所帮助,Good luck!。

相关文档
最新文档