MFC多文档和单文档视结构

合集下载

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针
CDocument对象 视列表 GetFirstViewPosition,GetNextView
文档模板 GetDocTemplate
CView 对象 文档对象 GetDocument
边框窗口 GetParentFrame
如何在OnDraw函数或***Dlg函数中获得View类的指针(this)或整个对话框的指针?
在单文档中你可以采用如下方法:
现在要获得指针的文件开始处包含两个文件:
视图的主框架类头文件,即#include "MainFrm.h"
视图类头文件,即#include "XXView.h"
在CDocument类中,调用GetFirstViewPosition()和GetNextView()得到所有的view。
在其它类中,一种方法先是把指针传进去,以备调用的时候使用。另外就要用AfxGetApp()得到CWinApp,然后再用GetFirstDocTemplatePosition()和GetNextDocTemplate()得到doc template,然后调用GetFirstDocPosition()和GetNextDoc()得到doc。
在文档类中(CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
MFC中怎么在CMainFrame下获得View类的指针
使用GetActiveView()函数
MFC中普通类如何获取view类的指针?
在普通类(Generic class)中怎么得到view类的指针?我试过这样:
然后在要访问m_pSet处添加如下语句
CMainFrame* frm=(CMainFrame*)AfxGetApp()->m_pMainWnd;

MFC中实现多文档

MFC中实现多文档

MFC中实现多文档(转)2007-12-27 21:21MDI (Multiple Document Interface) 是Windows 界面的一种规范,它建立多个窗口来浏览文档数据,如Windows 中的Program Manager 等都是按MDI 规范实现的。

在实际工程软件开发中,许多程序员将其作为一种实现多窗口的标准方法。

微软基础类库(Microsoft Foundation Class Library, 简称MFC 库), 是微软公司为方便Windows 程序开发所提供的一个功能强大的通用类库。

MFC 的核心是以类的形式封装了大量Windows API。

在可视化编程语言VC++ 下应用MFC 是目前开发Windows 程序最方便的途径之一。

VC++ 提供的各种开发工具如AppWizard、ClassWizard 和App Studio, 可以建立起具备基本功能的Windows 框架程序(Framework)。

而程序员所需要做的工作就是将自己特有的代码填入到框架程序中去,从而极大地减少了用户界面编程的工作量,加快了开发速度。

关于MDI 的标准开发方法可参考一般的Windows 编程书籍,本文将介绍利用MFC 实现MDI 界面。

MFC 2.0 以上版本支持“文档/ 浏览视窗”(Document/View) 结构模式。

由文档负责管理数据,浏览视窗负责数据显示及与用户的交互,从而实现了数据与界面的分离,使整个程序设计更具规范化、模块化。

MFC 中,“文档”由类CDocument 及其派生类实现( 简称Doc 类);“浏览视窗”由类CView 及其派生类实现 ( 简称View 类)。

二者都包含于应用程序的框架窗口中,并由其管理。

使用单文档时,框架窗口由类CFrameWnd 及其派生类实现;使用多文档时,框架窗口是利用类CMDIFrameWnd 和CMDIChildWnd 实现。

由文档模板将文档、浏览窗口和框架窗口三者联系起来。

第八章 VC++文档和视图

第八章 VC++文档和视图

第8章文档和视图精讲MFC应用程序的核心是文档/视图结构。

在前面章节的学习中,已经接触了不少文档/视图结构的应用程序,本章将详细分析其结构和原理,并进一步学习使用复杂的文档结构、构造更加丰富的视图。

8.1 文档/视图概述使用MFC的AppWizard可以创建三种类型的应用程序:(1)单文档界面的应用程序(SDI:Single Document Interface)(2)多文档界面的应用程序(MDI:Multiple Documents Interface)(3)基于对话框的应用程序(Dialog based)基于对话框的应用程序框架非常简单,由应用程序类、对话框类构成。

通过应用程序类的InitInstance()函数,构造一个模式对话框对象;调用DoModal()函数,让Windows对话框处理程序象通常情况一样接受和分配消息;用户退出对话框后,程序也就结束了。

我们已经知道SDI应用程序由应用程序类(CWinApp)、框架窗口类(CFrameWnd)、文档类(CDocument)、视图类(CView)和文档模板类(CSingleDocTemplate)共同作用。

MDI应用程序与SDI 应用程序的主要差别在于:MDI有CMDIFrameWnd和CMDIChildWnd两个框架窗口类,前一个派生CMainFrame类,负责菜单等界面元素的主框架窗口管理;后一个派生CChildFrame类,负责相应的文档及其视图的子框架维护。

而SDI由框架窗口类CFrameWnd 派生CMainFrame类。

一个文档可以有多个视图,但一个视图只能对应一个确定的文档。

因此,MDI应用程序需要解决的问题是多个文档的数据管理方法。

在MDI应用程序中,文档模板只支持主窗口。

每打开一个新文档时,都调用文档类的成员函数OnNewDocument(),建立一个由CMDIChildWnd派生的新的MDI子窗口,在子窗口中保存已打开的文档,所有这些细节都由MFC库来处理。

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类库的基本类

MFC类库是一个层次结构,主要有CObject类、应用程序类、可视对象类、绘图和打印类、通用类、数据库类、Internet和网络类、OLE类。

(1)CObject类CObject类是MFC的抽象基类,MFC中的大多数类是从CObject类派生出来的。

它是MFC 中多数类和用户自定义的根类,该类为程序员提供了希望融入所编写程序的许多公共操作,包括对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。

CObject类的声明在Afx.h中。

(2)应用程序结构类该类主要用于构造框架应用程序的结构,提供了多数应用程序公用的功能.编写程序的任务是填充框架,添加应用程序专有的功能。

1.应用程序和线程支持类CWinThread类是所有线程的基类,窗口应用程序类CWinApp类就是从该类中派生来的。

每个应用程序有且只有一个应用程序对象,在运行程序中该对象和其他对象相互协调,该对象从CWinApp中派生出来。

该类封装了初始化、运行、终止应用程序的代码。

2.命令相关类CCmdTarget类是CObject的子类,它是MFC所有具有消息映射属性的基类。

消息映射规定了当一对象接收到消息命令时,应调用哪个函数对该消息进行处理。

程序员很少需要从CCmdTarget类中直接派生出新类,往往都是从它的子类中派生出新类。

如窗口类(CWnd)、应用程序类(CWinApp)、文档模板类(CDocTemplate)、视类(CView)及框架窗口类(CFrameWnd)等。

3.文档类文档对象由文档对象模板创建,用于管理应用程序的数据。

视图对象表示一个窗口的客户区,用于显示文档数据并允许读者与之交互。

有关文档/视结构的类如下:①CDocTemplate类:文档模板的基类。

文档模板用于协调文档、视图和框架窗口的创建。

②CSingleDocTemplate类:单文档界面(SDI)的文档模板。

③CMultiDocTemplate类:多文档界面(MDI)的文档模板。

如何在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 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建:CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

多文档新建:CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

单文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

多文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

他们两个只有在docMultTemplate和docSingleTemplate的OpenDocumentFile函数中的动作不同,单文档负责新建框架类和视类但是如果存在了我们就不重建了,只是给其赋值。

而多文档无论如何都会新建一个视类和框架类文档类,这也就是为什么他是多文档结构的原因。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★接下来介绍这个最重要的函数,它基本什么都干了,不管是新建还是打开都得调用它,呵呵……//CDocument*CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible){//下面调用的是CDocTemplate::CreateNewDocument() CDocument* pDocument = CreateNewDocument();//这里面调用了AddDocument(pDocument);//添加了一个CMyMultiTestDoc : public CDocument//CMultiDocTemplate::m_docList保存的所有该种文档的//文档实例的指针列表。

if (pDocument == NULL){TRACE0("CDocTemplate::CreateNewDocumentreturned NULL.\n");AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); return NULL;}ASSERT_VALID(pDocument);BOOL bAutoDelete = pDocument->m_bAutoDelete; pDocument->m_bAutoDelete = FALSE; // don't destroy if something goes wrongCFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);//创建了一个新的CChildFrame框架pDocument->m_bAutoDelete = bAutoDelete;if (pFrame == NULL){AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); delete pDocument; // explicit delete on error return NULL;}ASSERT_VALID(pFrame);if (lpszPathName == NULL){// create a new document - with default document name SetDefaultTitle(pDocument);// avoid creating temporary compound file when starting up invisibleif (!bMakeVisible)pDocument->m_bEmbedded = TRUE;if (!pDocument->OnNewDocument())//刚打开时新建的文档。

add by ralf{// user has be alerted to what failed in OnNewDocumentTRACE0("CDocument::OnNewDocument returned FALSE.\n");pFrame->DestroyWindow();return NULL;}// it worked, now bump untitled countm_nUntitledCount++;}else{// open an existing documentCWaitCursor wait;if(!pDocument->OnOpenDocument(lpszPathName))//这里是打开一个文档。

add by ralf{// 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;}要了解文档、视图、框架窗口、文档模板之间的相互关系,关键要理解他们的结构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 我们最熟悉不过了。

每一个文档实例可有多个视与之相对应。

CDocument::m_viewList用来保存所有与此文档实例相关的View★★★★这里我拉鲁夫说一下:CDocument::AddView函数用来维护m_viewList数据但我们一般不用★★★★void CDocument::AddView(CView*pView)//★★★MFC源码{ASSERT_VALID(pView);ASSERT(pView->m_pDocument == NULL); //must not be already attachedASSERT(m_viewList.Find(pView, NULL) == NULL); // must not be in listm_viewList.AddTail(pView);ASSERT(pView->m_pDocument == NULL); // must be un-attachedpView->m_pDocument = this;OnChangedViewList(); // must be the last thing done to the document}CDocument::GetDocTemplate 可获得CMultiDocTemplate;4、CView 他是放在CMDIChildWnd里的,每一个CMDIChildWnd有一个ViewCView::GetDocument可获得与此视相关的CDocumentCView::GetParentFrame() 可获得CMDIChildWnd;通过以上分析可见CWinApp,CMDIChildWnd,CView,CDocument,CMultiDocT emplate之间知道其中一个实例必可知道其他所有几个实例,CWinApp统领全局,任何时候,只要获得CWinApp实例,则所有的文档模板,文档实例,视,Frame窗口均可被枚举出来。

相关文档
最新文档