文档视图
Word视图切换的技巧

Word视图切换的技巧在使用Microsoft Word进行文档编辑的过程中,经常会遇到需要切换不同的视图来方便阅读和编辑文档的情况。
本文将介绍一些Word视图切换的技巧,帮助您更高效地使用这一功能。
1. 标准视图标准视图是Word中最常用的视图,它显示了文档的结构和内容,以便于编辑和阅读。
要切换到标准视图,您可以使用以下方法之一:- 点击工具栏上的"视图"选项卡,在"视图"选项卡中选择"标准"视图。
- 使用快捷键"Ctrl + Alt + N"。
2. 页面布局视图页面布局视图以文章的样子显示文档,并提供了更直观的页面布局效果。
您可以通过以下方式切换到页面布局视图:- 点击工具栏上的"视图"选项卡,在"视图"选项卡中选择"页面布局"视图。
- 使用快捷键"Ctrl + Alt + P"。
3. 阅读布局视图阅读布局视图以适应屏幕的方式显示文档,模拟了阅读纸质杂志或书籍的效果。
要切换到阅读布局视图,您可以使用以下方法之一:- 点击工具栏上的"视图"选项卡,在"视图"选项卡中选择"阅读布局"视图。
- 使用快捷键"Ctrl + Alt + O"。
4. 大纲视图大纲视图将文档的结构以大纲形式显示,方便您查看和调整文档的层次结构。
要切换到大纲视图,可以使用以下方式:- 点击工具栏上的"视图"选项卡,在"视图"选项卡中选择"大纲"视图。
- 使用快捷键"Ctrl + Alt + H"。
5. 合并文档视图合并文档视图是在进行邮件合并时使用的视图,它可以显示合并后的文档效果。
要切换到合并文档视图,可以使用以下方式之一:- 点击工具栏上的"视图"选项卡,在"视图"选项卡中选择"合并文档"视图。
Word中的拆分视图和并排视图方法

Word中的拆分视图和并排视图方法Word是一款广泛应用于办公和文档处理的软件,它提供了丰富的功能和工具,使我们能够更加高效地编辑和排版文档。
在Word中,拆分视图和并排视图是两种常用的排版方式,它们可以帮助我们更好地组织和展示文档内容。
本文将介绍Word中的拆分视图和并排视图方法,并探讨它们的应用场景和优势。
一、拆分视图拆分视图是一种将文档分割成两个窗口的排版方式,可以同时显示文档的两个部分,方便我们在不同位置进行编辑和查看。
在Word中,我们可以通过以下步骤进行拆分视图的设置:1. 打开Word文档,点击“视图”选项卡,然后在“窗口”组中点击“拆分”按钮。
2. 在弹出的对话框中,可以选择水平或垂直方向进行拆分,并通过拖动分割线的位置来调整两个窗口的大小。
3. 在拆分视图中,我们可以在一个窗口中编辑文档的某一部分,同时在另一个窗口中查看其他部分的内容。
这对于大型文档或需要同时参考多个部分的情况非常有用。
拆分视图的优势在于可以提高编辑和查看效率,特别适用于需要同时操作多个部分的文档。
比如,在编辑一份包含目录和正文的文档时,我们可以将目录和正文分别显示在两个窗口中,方便我们在编辑目录的同时查看正文的内容,从而减少了来回切换的操作。
二、并排视图并排视图是一种将文档分割成多个窗口的排版方式,可以同时显示文档的多个部分,使得我们可以更好地比较和对比不同部分的内容。
在Word中,我们可以通过以下步骤进行并排视图的设置:1. 打开Word文档,点击“视图”选项卡,然后在“窗口”组中点击“新建窗口”按钮。
2. 在新打开的窗口中,可以选择在当前窗口的左侧、右侧、上方或下方显示文档的副本。
3. 在并排视图中,我们可以在不同的窗口中同时编辑和查看文档的不同部分,方便我们进行比较和对比。
同时,Word还提供了同步滚动的功能,使得我们在一个窗口中滚动文档时,其他窗口也会自动滚动到相应位置,方便我们进行跨部分的比较。
并排视图的优势在于可以提高对比和分析的效率,特别适用于需要比较和对比多个部分的文档。
word文档视图设置(word2010的视图方式有哪些)--

word文档视图设置(word2010的视图方式有哪些)word怎么切换普通视图北京工商大学如何将页面视图转换为普通视图这是由于显示比例太大所致。
您可以使用以下方法使其恢复正常:选择视图选项卡:,单击按钮;然后单击“确定”。
单击单页按钮;两者都可以使页面显示恢复正常。
方法2:按住键并向下滚动鼠标滚轮以减小显示比例,并使页面显示恢复正常。
页面变得越来越好,如何变得越来越小。
上一个文档旁边有空白,但是现在不见了。
如何将其更改回以前的显示比例?另外,请查看文件页面设置。
边距是否已更改。
文档中的常用视图是什么?文档中的共同观点是什么?在文档中获取图表的最常见方法是书访方法。
共有五种类型:页面视图(最常用),普通视图,大纲视图,布局视图和阅读布局视图。
如何在参考中创建目录,选择目录,设置设置后,将自动编译目录。
提示:如果要拥有一个好的目录,则必须预先设置每个段落的格式。
步骤1.自动生成目录准备:近似索引。
如果要自动生成目录,则必须首先建立系统可以识别的轮廓索引。
这是自动生成目录的前提。
选择您的标题。
在开始选项卡中,选择格式,然后选择所需的目录格式结构。
选择后,将建立大纲索引,同时,它将具有默认的标题格式。
,以同样的方式,我们逐级设置标题,标题和其他目录结构索引。
以同样的方式,我们为整个文档中的所有标题构建了大纲索引。
第二步,自动生成和更新目录,已经进行了必要的准备,然后我们开始生成目录。
首先,将光标定位到目录的存储位置,然后单击自动引用目录或选项卡上的。
,目录将自动生成。
,如果您更新多篇文章或调整目录结构,则需要更新目录,单击目录,右键单击下拉菜单-更新字段。
,建议选择更新整个目录,以免丢失。
单击确定进行更新。
自定义目录格式调整如果您对系统的默认目录格式不满意,需要对其进行自定义,则也可以。
单击参考目录,以插入目录。
可以设置许多目录格式选项,例如是否显示页面,页面是否向右对齐,显示选项卡以及显示多个级别。
文档视图

文档/视图在MFC1.0中,应用程序有两个主要的组件:代表应用程序自身的应用程序对象和代表应用程序窗口的窗口对象。
应用程序对象的主要任务是创建窗口,反过来窗口再处理消息。
MFC几乎就是对WindowsAPI的封装。
在MFC2.0中,引入文档/视图体系结构,改变了MFC应用程序编制的方式。
在Doc/View中,应用程序的数据由文档对象代表,而数据的视图由视图对象代表。
文档和视图合作来处理用户的输入并绘制结果数据的文字和图形表示。
应用程序的主窗口,其操作功能在CFrameWnd和CMDIFrameWnd 类中实现,已经不再以消息处理为工作焦点了,而是作为视图,工具栏以及其他用户界面对象的容器。
利用MFC体系结构的好处是简化了开发过程,主结构提供了处理常规杂务的程序代码。
现在程序开发者对于使用MDI并不积极,这是由于SDI模型改善了以文档为中心的用户界面。
如果用户想同时编辑两个文档,Microsoft 更加愿意每个文档都在分开的应用程序实例中显示。
因此要以单文档为重点。
框架窗口是应用程序的顶层窗口,通常是WS_OVERLAPPEDWINDOW样式的窗口,带有可缩放边框,带有标题栏,系统菜单和最小,大化按钮和关闭按钮。
视图是子窗口,实际中作为框架窗口的客户区。
应用程序对象提供消息循环给框架窗口和视图提取消息。
视图对象将鼠标和键盘输入转换为处理保存在文档中的数据的命令,文档对象提供了视图所需要的用来输出的数据。
文档/视图应用程序从来不会为框架窗口获取客户区设备描述表并在其中绘制输出,相反它绘制输出到视图中。
看上去好像在框架窗口中绘制,实际上所有输出都输出到视图中。
如果愿意,可以给框架窗口绘制内容,但是您看不到任何结果,因为SDI框架窗口的客户区完全被视图遮盖了。
SDI文档模板CSingleDocTemplate是SDIDoc/View中最重要的部分。
RUNTIME_CLASS宏对于所指定的类返回指向了CRuntimeClass结构的指针,这就使得主结构可以在运行时创建这些类的对象了。
Word视图切换的技巧

Word视图切换的技巧Word是一款广泛使用的文字处理软件,它提供了多种不同的视图供用户选择,以便更好地编辑和排版文档。
视图切换是Word的一个重要功能,它可以让用户在不同的视图下查看和编辑文档内容。
下面将介绍一些Word视图切换的技巧,帮助用户更高效地使用这一功能。
1. 视图选项卡在Word中,视图选项卡位于软件菜单栏的最上方,在默认情况下可以直接点击该选项卡来显示或隐藏视图工具栏。
视图工具栏中包含了多个视图选项,用户可以通过点击这些选项来切换不同的视图。
2. 打开文档时的默认视图在Word中,用户可以设置在打开文档时的默认视图。
默认情况下,Word会以“打开文档视图”来显示文档内容。
用户可以在“文件”选项卡中选择“选项”,然后选择“高级”选项卡,找到“显示”部分的“开始时显示这种文档视图”选项,从列表中选择所需的默认视图。
根据需求,用户可以选择“打开文档视图”、“阅读视图”、“打印布局视图”或“Web布局视图”。
3. 常用视图切换快捷键除了通过视图选项卡切换视图外,Word还提供了一些常用的视图切换快捷键,以方便用户更快速地切换不同的视图。
以下是一些常用的快捷键:- 普通视图(默认视图):Ctrl+Alt+N- 打开文档视图:Ctrl+Alt+P- 阅读视图:Ctrl+Alt+O- 打印布局视图:Ctrl+Alt+M- 草稿视图:Ctrl+Alt+Y- 异常视图:Ctrl+Shift+84. 快速访问工具栏Word还提供了一个称为“快速访问工具栏”的选项,它位于软件窗口的左上角,用户可以通过自定义此工具栏来添加视图切换功能。
用户可以点击“文件”选项卡,然后选择“选项”,接着选择“快速访问工具栏”选项,从左侧的“选择命令”列表中选择“视图切换器”,点击“添加”按钮,最后点击“确定”。
添加完成后,用户就可以直接通过点击此工具栏上的视图切换器按钮来切换不同的视图。
5. 多窗口视图Word还支持多窗口视图,允许用户在同一时间内打开多个窗口来显示不同的视图。
基于文档视图结构的程序

文档视图架构的重要性
提高软件的可维护性和可扩展性
文档视图架构使得数据和视图可以独立变化,当数据发生变化时,只需要更新模型,而不 需要修改视图;同样,当用户界面发生变化时,也只需要修改视图,而不需要修改模型。 这大大降低了软件维护和扩展的难度。
提高软件的可重用性
文档视图架构使得模型、视图和控制器可以独立使用,从而提高了软件组件的重用性。例 如,不同的应用程序可以使用相同的模型和视图,只需要更换控制器即可实现不同的功能 。
提高软件的可定制性
文档视图架构允许用户自定义视图和控制器,从而使得应用程序能够更好地满足用户的个 性化需求。例如,用户可以通过更换皮肤或主题来自定义应用程序的外观和风格。
事件处理
控制器模型负责监听和处理用户输入事件,如点击、拖拽和键盘输 入等。
协调机制
控制器模型应协调文档模型和视图模型之间的交互,确保数据的一致 性和程序的正常运行。
04
文档视图架构的优缺点
优点
1 2
灵活性
文档视图架构允许开发者根据需要灵活地组织应 用程序的各个部分,使得应用程序更加易于扩展 和维护。
协作与共享
基于文档视图结构的程序能够支持多人同 时编辑同一份文档,并实时同步更新,提 高团队协作效率。此外,通过共享和权限 管理功能,确保文档的安全性和保密性。
数据库管理系统
数据建模与关系管理
数据库管理系统(如MySQL、Oracle、SQL Server等)使用基于文档视图结构的程序来展示和管理 数据之间的关系。通过数据表、视图和查询等工具,用户可以创建、修改和查询数据库中的数据。
Word2003的视图方式

• 三、大纲视图:对于一个具有多重标题的文档而言,我们往往需 大纲视图:对于一个具有多重标题的文档而言, 要按照文档中标题的层次来查看文档( 要按照文档中标题的层次来查看文档(如只查看某重标题或查看 所有文档等),此时采用前述几种视图方式就不太合适了, ),此时采用前述几种视图方式就不太合适了 所有文档等),此时采用前述几种视图方式就不太合适了,而大 纲视图方式则正好可解决这一问题。 纲视图方式则正好可解决这一问题。大纲视图方式是按照文档中 标题的层次来显示文档,用户可以折叠文档,只查看主标题, 标题的层次来显示文档,用户可以折叠文档,只查看主标题,或 者扩展文档,查看整个文档的内容, 者扩展文档,查看整个文档的内容,从而使得用户查看文档的结 构变得十分容易。在这种视图方式下, 构变得十分容易。在这种视图方式下,用户还可以通过拖动标题 来移动、复制或重新组织正文,方便了用户对文档大纲的修改。 来移动、复制或重新组织正文,方便了用户对文档大纲的修改。 采用大纲视图方式显示Word文档的办法为:执行“视图” Word文档的办法为 采用大纲视图方式显示Word文档的办法为:执行“视图”菜单中 大纲”命令,或按下Alt+Ctrl+O组合键。 Alt+Ctrl+O组合键 的“大纲”命令,或按下Alt+Ctrl+O组合键。
2003给我们 五、此外,为了满足用户不同的需要,Word 2003给我们 此外,为了满足用户不同的需要, 提供了其它查看方式来,它们是:阅读、文档结构图、 提供了其它查看方式来,它们是:阅读、文档结构图、全 屏显示、打印预览, 这些查看方式只需执行“视图” 屏显示、打印预览, 这些查看方式只需执行“视图”菜 单中的相应命令即可。 单中的相应命令即可。
二、页面视图: Word的页面视图方式即直接按照 页面视图: Word的页面视图方式即直接按照 用户设置的页面大小进行显示, 用户设置的页面大小进行显示,此时的显示效果与 打印效果完全一致,用户可从中看到各种对象( 打印效果完全一致,用户可从中看到各种对象(包 括页眉、页脚、水印和图形等) 括页眉、页脚、水印和图形等)在页面中的实际打 印位置,这对于编辑页眉和页脚,调整页边距, 印位置,这对于编辑页眉和页脚,调整页边距,以 及处理边框、图形对象当分栏都是很有用的。 及处理边框、图形对象当分栏都是很有用的。执行 视图”菜单中的“页面”命令或按Alt+Ctrl+ “视图”菜单中的“页面”命令或按Alt+Ctrl+ P 组合键即可切换到页面视图方式。 组合键即可切换到页面视图方式。
Word 中的5种视图特征

Word 中的5种视图特征:
普通视图:在普通视图中可以键入、编辑、设置文本格式,不显示页边距、页眉页脚、背景、图形对象以及没有设置为“嵌于文字所在层”环绕方式的图片。
文档只有水平标尺,软分页为虚线显示,硬分页或者其他分隔符用实线及文字显示,文档以“—”结束
Web页视图:在web视图中可创建能显示在屏幕上的web页和文档,可以看到背景和为适应窗口而换行显示的文本,且图形位置与在web浏览器中的位置一致。
文档只有水平标尺。
页面视图:在页面视图中可以看到在打印出的页面文字、图片和其他元素的位置。
可以用于编辑页面的页眉页脚、调整页边距和处理栏及图形对象。
文档由水平标尺和垂直标尺。
大纲视图:在大纲视图中可以查看文档的结构,还可以通过拖到标题来移动、复制和重新组织文本,可以通过大纲工具栏上的按钮来折叠文档查看主要标题,或者展开文档以查看所有标题及正文。
大纲视图中不显示页边距、页眉页脚、图片和背景。
文档没有标尺、以“—”结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档/视图结构中的各个部分是如何联系到一起的.分类:Visual C++ 2004-12-08 15:50 2683人阅读评论(0) 收藏举报文档nullclasspascalmfc框架#define DECLARE_DYNCREATE(class_name) /DECLARE_DYNAMIC(class_name) /static CObject* PASCAL CreateObject(); 文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及了应用、文档模板、文档、视图、MDI框架窗口、MDI子窗口等不同的对象,如果不了解这些部分之间如何关联的话,就可能犯错误,也就很难编出有水平的文档/视图程序。
比如我在初学VC编程的时候,为应用程序添加了两个文档模板,两个模板公用一个文档类,只是视图不一样,期望当一个模板的文档的视图改变了文档后,调用UpdateAllViews后也能更新另一个文档模板的视图,结果当然是不行的,原因就是对MFC的文档/视图结构没有深入的了解,了解的最好方法就是阅读一下MFC的源代码。
下面就是我的笔记:(一)应用程序对象与文档模板之间的联系:首先,在应用程序对象中有一个CDocManager指针类型的共有数据成员m_pDocManager,在CDocManager中维护一个CPtrList类型的链表:m_tempateList,它是一个保护成员。
InitInstance函数中调用CWinApp::AddDocTemplate函数,实际上是调用m_pDocManager的AddDocTemplate函数向链表m_templateList添加模板指针。
CWinApp 提供了GetFirstDocTemplatePosition和GetNextDocTemplate函数实现对m_templateList链表的访问(实际上是调用了CDocManager的相关函数)。
在文件操作方面CWinApp提供的最常用的功能是文件的新建(OnFileNew)和打开(OnFileOpen),它也是调用CDocManager类的同名函数。
对于新建,一般的时候在只有一个文档模板的时候,它新建一个空白的文件;如果有多个文档模板的时候,它会出现一个对话框提示选择文档类型。
它的源代码如下:void CDocManager::OnFileNew(){if (m_templateList.IsEmpty()){.......return;}//取第一个文档模板的指针CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();if (m_templateList.GetCount() > 1){// 如果多于一个文档模板,出现对话框提示用户去选择CNewTypeDlg dlg(&m_templateList);int nID = dlg.DoModal();if (nID == IDOK)pTemplate = dlg.m_pSelectedTemplate;elsereturn; // none - cancel operation}......//参数为NULL的时候OpenDocument File会新建一个文件pTemplate->OpenDocumentFile(NULL);}打开文件:void CDocManager::OnFileOpen(){// 出现打开文件对话框CString newName;if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,OFN_HIDEREADONL Y | OFN_FILEMUSTEXIST, TRUE, NULL))return; // open cancelledAfxGetApp()->OpenDocumentFile(newName); //实际也是调用文档模板的名函数}(二)文档模板与文档之间的联系:从上面看出应用程序对象对文件的新建和打开是依靠文档模板的OpenDocumentFile函数实现的。
MFC的模板类是用来联系文档类、视类和框架类的,在它的构造函数就需要这三者的信息:CDocTemplate ( UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass );构造函数利用后三个参数为它的三个CruntimeClass*类型的保护成员赋值:m_pDocClass = pDocClass;m_pFrameClass = pFrameClass;m_pViewClass = pViewClass;文档模板分为单文档模板和多文档模板两种,这两个模板的实现是不同的,除了上面的三个成员,内部有彼此不相同的但是很重要的成员变量。
对于多文档模板:CPtrList m_docList;,单文档模板:CDocument* m_pOnlyDoc;。
它们都有一个成员函数AddDocument,分别各自的成员进行赋值操作,而在它们的父类的CDocTemplate中则是为它所添加的文档的m_pDocTemplate变量赋值为模板自己的地址:void CDocTemplate::AddDocument(CDocument* pDoc){ASSERT_V ALID(pDoc);ASSERT(pDoc->m_pDocTemplate == NULL);pDoc->m_pDocTemplate = this;}由于单文档模板只能拥有一个文档,所以它只是维护一个指向自己所拥有的模板的指针:m_pOnlyDoc,AddDocument函数就是要为这个成员赋值:void CSingleDocTemplate::AddDocument(CDocument* pDoc){......CDocTemplate::AddDocument(pDoc);m_pOnlyDoc = pDoc;}由于多文档模板可以拥有多个文档,所以它要维护的是包含它所打开的所有文档的指针的链表,所以它的AddDocument的实现为:void CMultiDocTemplate::AddDocument(CDocument* pDoc){......CDocTemplate::AddDocument(pDoc);m_docList..AddTail(pDoc);}模板通过m_pOnlyDoc(单文档)或记住了自己所拥有的所有的模板的指针,并通过GetFirstDocPosition和GetNextDoc函数可以实现对它所拥有的文档的访问,同时使文档记住了自己所属文档模板的指针,同时文档提供了GetDocTemplate()函数可以取得它所属的模板。
对AddDocument函数的调用主要是发生在另一个成员函数CreateNewDocument里,它的作用是创建一个新的文档:CDocument* CDocTemplate::CreateNewDocument(){if (m_pDocClass == NULL){……}CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();……AddDocument(pDocument);return pDocument;}CreateNewDocument函数主要利用文档类的运行时指针的函数CreateObject创建一个新文档对象,并利用AddDocument将其指针赋給相关的成员,留做以后使用。
在应用程序的OnFileNew和OnFileOpen函数都使用了模板的OpenDocumentFile函数,而且在实际编程的时候也大都使用这个函数。
在MSDN的文档说这个函数当参数不为NULL 的时候打开文件,否则就用上面所说的CreateNewDocument函数创建一个新文档,那么它是如何实现的呢?CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible){CDocument* pDocument = NULL;CFrameWnd* pFrame = NULL;BOOL bCreated = FALSE; // => doc and frame createdBOOL bWasModified = FALSE;//如果已经有打开的文档,就会询问否保存文件if (m_pOnlyDoc != NULL){pDocument = m_pOnlyDoc;if (!pDocument->SaveModified())return NULL;pFrame = (CFrameWnd*)AfxGetMainWnd();......}//创建新文件else{pDocument = CreateNewDocument();ASSERT(pFrame == NULL);bCreated = TRUE;}......//如果第一次创建文档则也要创建框架窗口。
if (pFrame == NULL){ASSERT(bCreated);// create frame - set as main document frameBOOL bAutoDelete = pDocument->m_bAutoDelete;pDocument->m_bAutoDelete = FALSE;pFrame = CreateNewFrame(pDocument, NULL);pDocument->m_bAutoDelete = bAutoDelete;......}if (lpszPathName == NULL){// 为新文档设置默认标题SetDefaultTitle(pDocument);……//一般的时候重载OnNewDocument初始化一些数据,如果返回FALSE,表示初始化失//败,销毁窗口。
if (!pDocument->OnNewDocument()){......if (bCreated)pFrame->DestroyWindow(); // will destroy documentreturn NULL;}}else{CWaitCursor wait;// open an existing documentbWasModified = pDocument->IsModified();pDocument->SetModifiedFlag(FALSE);//OnOpenDocument函数重新初始化文档对象if (!pDocument->OnOpenDocument(lpszPathName)){if (bCreated){//新建文档的情况pFrame->DestroyWindow();}else if (!pDocument->IsModified()){// 文档没有被修改,恢复原来文档的修改标志pDocument->SetModifiedFlag(bWasModified);}else{// 修改了原始的文档SetDefaultTitle(pDocument);if (!pDocument->OnNewDocument()){TRACE0("Error: OnNewDocument failed after trying to open a document - trying to continue./n");}}return NULL; // open failed}pDocument->SetPathName(lpszPathName);}CWinThread* pThread = AfxGetThread();if (bCreated && pThread->m_pMainWnd == NULL){pThread->m_pMainWnd = pFrame;}InitialUpdateFrame(pFrame, pDocument, bMakeVisible);return pDocument;}以下是多文档模板的OpenDocumentFile的实现CDocument* CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible){//新建一个文档对象CDocument* pDocument = CreateNewDocument();……BOOL bAutoDelete = pDocument->m_bAutoDelete;pDocument->m_bAutoDelete = FALSE;CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);pDocument->m_bAutoDelete = bAutoDelete;……if (lpszPathName == NULL)//当是新建的时候{SetDefaultTitle(pDocument);// avoid creating temporary compound file when starting up invisibleif (!bMakeVisible)pDocument->m_bEmbedded = TRUE;if (!pDocument->OnNewDocument()){pFrame->DestroyWindow();return NULL;}m_nUntitledCount++;}else{// 打开一个已经存在的文件CWaitCursor wait;if (!pDocument->OnOpenDocument(lpszPathName)){// user has be alerted to what failed in OnOpenDocumentTRACE0("CDocument::OnOpenDocument returned FALSE./n");pFrame->DestroyWindow();return NULL;}pDocument->SetPathName(lpszPathName);}InitialUpdateFrame(pFrame, pDocument, bMakeVisible);return pDocument;}从上面看出模板类的OpenDocumentFile函数里,利用CreateNewDocument对象使文档对象与模板对象建立了联系,利用了CreateNewFrame函数使框架窗口与文档、视图、模板发生了联系:CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther){if (pDoc != NULL)ASSERT_V ALID(pDoc);ASSERT(m_nIDResource != 0); // 必须有资源IDCCreateContext context;context.m_pCurrentFrame = pOther;context.m_pCurrentDoc = pDoc;context.m_pNewViewClass = m_pViewClass;context.m_pNewDocTemplate = this;if (m_pFrameClass == NULL){……}CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();if (pFrame == NULL){……return NULL;}ASSERT_KINDOF(CFrameWnd, pFrame);if (context.m_pNewViewClass == NULL)TRACE0("Warning: creating frame with no default view./n");if (!pFrame->LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // defaultframe stylesNULL, &context)){……return NULL;}return pFrame;}从上面的函数可以看出文档、视图、框架窗等都是通过RUNTIME_CLASS宏得到的CRuntimeClass指针调用CreateObject函数得到的. RUNTIME_CLASS的定义为:#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name)) 在每个运行使用这个宏的类的声明里都有这样的声明:protected:DECLARE_DYNCREATE(CUIDoc)它的定义是:#define DECLARE_DYNCREATE(class_name) /DECLARE_DYNAMIC(class_name) /static CObject* PASCAL CreateObject();#ifdef _AFXDLL#define DECLARE_DYNAMIC(class_name) /protected: /static CRuntimeClass* PASCAL _GetBaseClass(); /public: /static const AFX_DATA CRuntimeClass class##class_name; /virtual CRuntimeClass* GetRuntimeClass() const;#else#define DECLARE_DYNAMIC(class_name) /public: /static const AFX_DATA CRuntimeClass class##class_name; /virtual CRuntimeClass* GetRuntimeClass() const;#endif上面的宏声明了CreateObject函数,在IMPLEMENT_DYNCREA TE宏里实现了它:#define IMPLEMENT_DYNCREATE(class_name, base_class_name) /CObject* PASCAL class_name::CreateObject() /{ return new class_name; } /IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, /class_name::CreateObject)CRuntimeClass就是调用了每个类相应的静态函数CreateObject创建了对象。