MFC多文档多视图编程

合集下载

mfc 代码关闭当前多文档的子窗口

mfc 代码关闭当前多文档的子窗口

MFC(Microsoft Foundation Class)是微软公司开发的用于Windows评台的C++类库,用于简化Windows应用程序的开发。

在MFC中,关闭当前多文档的子窗口可以通过以下步骤实现:1. 获取当前活动的文档视图需要获取到当前处于活动状态的文档视图,可以通过以下代码实现:```cppCWnd* pActiveWnd = AfxGetM本人nWnd(); CMDIChildWnd* pChild = (CMDIChildWnd*)pActiveWnd; CView* pView = pChild->GetActiveView();```2. 关闭子窗口有了当前活动的文档视图之后,可以通过以下代码关闭子窗口:```cpppChild->MDIDestroy();```在这段代码中,`MDIDestroy` 函数用于关闭当前子窗口。

3. 整合关闭子窗口的代码将以上两个步骤整合在一起,完整的代码如下所示:```cppCWnd* pActiveWnd = AfxGetM本人nWnd(); CMDIChildWnd* pChild = (CMDIChildWnd*)pActiveWnd; CView* pView = pChild->GetActiveView();pChild->MDIDestroy();```这样,就可以在MFC中关闭当前多文档的子窗口了。

以上代码基于MFC类库,在多文档程序框架下实现了关闭当前子窗口的功能。

在实际开发中,可以根据具体的需求和程序结构进行适当的修改和扩展。

总结起来,关闭当前多文档的子窗口在MFC中实现并不复杂,通过获取当前活动的文档视图并调用相应的函数即可完成这一操作。

希望本文对MFC开发者能有所帮助。

初步思考:续写部分将围绕MFC中关闭子窗口的方法展开,涉及到MFC开发中更广泛的内容,包括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;

第八章 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编程基础

9
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project Empty project 在共享 DLL 中使用 MFC
10
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project,Empty project,在共享 DLL 中使用 MFC
2 最简单的MFC应用程序
2 最简单的MFC应用程序
13
2 最简单的MFC应用程序


WinMain()函数,由MFC库后台自动提供; CWinApp类:



对基于MFC的程序重要,其对象包括启动、初始化、运行 和关闭应用程序所需的一切代码。 需要由CWinApp派生出工程自己的应用程序类 虚函数InitInstance(),需要重写,包含创建和显示应用程序 窗口的代码,由WinMain()函数调用; 该类继承的其它成员不变。


2014-5-17
26
消息映射例 class CSketcherApp : public CWinAppEx { public: 为了使用消息映射宏,还需要在类声明 的结尾用DECLARE_MESSAGE_MAP宏, CSketcherApp(); 该宏对类实现源文件中所定义的消息映 // 重写 射进行初始化。 public: virtual BOOL InitInstance(); virtual int ExitInstance(); // 实现 UINT m_nAppLook; virtual void PreLoadState(); 用于区分消息处 virtual void LoadCustomState(); 理函数和类中 virtual void SaveCustomState();

如何在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编程基础教程

MFC编程基础教程

MFC编程基础教程第1章基于对话框的Windows应用程序1.简介Windows编程的两种方法,即Windows API编程和MFC编程。

2.基于对话框的应用程序的创建过程:•建立基于对话框的MFC 应用程序框架;•放置控件;•设置控件属性;•为控件连接变量,即为控件命名;•添加并且编写消息处理函数。

3.常用基本控件:•静态文本框:主要用来显示文本信息,不能接受用户输入•命令按钮:是最常见的、应用最广泛的一种控件。

在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。

•编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。

这是一个简单的Windows 应用程序。

Windows 应用程序的主函数是WinMain() ,不是main() 函数。

函数体中调用了Windows API 函数MessageBox() ,弹出如图所示的对话框。

在直接使用API 函数进行Windows 编程时,程序员不仅需要熟记一大堆常用的API 函数,而且还要对Windows 操作系统有深入的了解,编写大量的代码。

用这种方式即使是开发一个很简单的应用程序也需要大量的工作,直接用API 函数进行编程是需要极大的耐心和丰富的编程经验的。

1.1.2 MFC编程MFC 是Visual C++ 的核心。

虽然在Windows 应用程序中可以直接调用API 函数,但是一般不经常直接调用,而是从MFC 类创建对象并调用属于这些对象的成员函数。

MFC 是Microsoft 公司提供的用来编写Windows 应用程序的C++ 类库,MFC 大约有200 多个类,可以分成两种:一是Cobject 类的派生类,它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的Windows 实体对应;二是非Cobject 派生类,这些都是独立的类,如表示点的Cpoint 类,表示矩形的Crect 类。

在Visual C++ 中,可以创建以下 3 类典型的Windows 应用程序,它们都是通过MFC AppWizard(exe) (以下简称AppWizard )向导创建的:(1)基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如Windows 自带的计算器程序。

MFC编程

MFC编程

MFC编程微软基础类库(MFC:Microsoft Foundation Class)是微软为Windows程序员提供的一个面向对象的Windows 编程接口,它大大简化了Windows编程工作。

使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。

MFC库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到你自己开发的应用程序中去。

对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用;另外,新的应用程序还能立即支持所有标准Windows特性,而且是用普通的、明确定义的形式。

事实上,也就是在Windows应用程序界面基础上定义了一种新的标准——MFC标准。

为了更好的理解MFC,我们有必要了解一下MFC的历史。

2.4.1 MFC历史开始,Microsoft建立了一个AFX小组,AFX代表Application Framework,即应用程序框架。

据说创建该小组原意是为了发布一个Borland C++的OWL的竞争性产品,因为那时侯Borland 公司的应用程序框架OWL(object Windows Language)已经做的相当成功。

AFX小组象OWL那样,提出了一个高度抽象Windows API的一个类库。

他们采用自顶向下的设计方法,逐步将对象抽象出来,并施加到Windows上。

然后,他们试着花了几个月时间用这个类库来编写应用程序,结果发现这个类库偏离Windows API实在太远,过分抽象并没有太大的实用性,相反大大降低了应用程序的效率。

于是,他们干脆放弃了整个AFX类库,对类库进行重新设计。

这次,他们采用了自底向上的方法,从已有的Windows API着手,将类建立在Windows API对象基础上,设计出后来成为MFC1.0的一个类库。

基于单文档的(MFC)窗口分割

基于单文档的(MFC)窗口分割

基于单文档的窗口分割简介部分是对于MFC应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。

不需要的朋友可以从第二部分程序设计开始看起。

目录基于单文档的窗口分割 (1)简介 (3)MFC应用程序类型简介 (3)单文档与多视图 (5)单文档多视图程序设计 (6)Step1:创建单文档的MFC程序 (6)Step2:声明相关的变量。

(6)Step3:重载OnCreateClient()函数,进行窗口的分割 (7)Step4:设置行列初始值 (9)附:代码 (10)简介MFC应用程序类型简介在Microsoft VC++ 6.0中,基于MFC的应用程序一般分为以下几种:多文档界面(MDI)单文档界面(SDI)基于对话框的应用程序。

图1-1 应用程序类型其中单文档又可分为单视图的和多视图的。

图1-2 单文档单视图图1-3 单文档多视图一般情况下,单文档仅需要单视图就够了,如Windows自带的记事本、画图程序等等,但在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。

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

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

单文档与多视图一般地,单文档与多视图有三种情况:1)在多文档界面MDI中,每个视图位于MDI的一个独立子文档框架中,视图对象基于同一个视图类。

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

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

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

深入了解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 的独立数据对象。

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

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

单独的视窗完全遮蔽框架窗口的客户区,这意味着即使程序员直接绘画至框架窗口的客户区,视图仍遮蔽绘画,在屏幕上不出现任何信息。

所以输出必须通过视图。

框架窗口仅仅是个视图容器。

CDocument类对文档的建立及归档提供支持并提供应用程序用于控制其数据的接口。

MDI应用程序可以处理多个类型的文档,每个类型的文档拥有一个相关联的文档模板对象。

文档对象驻留在场景后面,提供由视图对象显示的信息。

文档至少有一个相关联的视图。

视图只能与一个文档相关联。

在文档/视方式中,对象的建立是由文档模板来管理的,它是CDocTemplate派生对象,建立并维护框架窗口,文档及视。

MFC调用命令处理程序以响应发生在应用程序中的事件。

命令发送的优先级是:活动的视图->框架窗口->文档->应用程序->默认窗口过程(DefWindowsProc) 总之,在文档/视方式中,文档和视是分离的,即:文档用于保存数据,而视是用来显示这些数据。

文档模板维护它们之间的关西。

这种文档/视结构在开发大型软件项目时特别有用。

(二)、了解与文档/视结构有关的各种类之间的关系。

在文档/视应用程序中,CWinApp 对象拥有并控制文档模板,后者产生文档、框架窗口及视窗。

这种相互关系如图(1)所示:从用户的角度来看,“视”实际上是一个普通的窗口。

象其他基于Widnows 应用的窗口一样,人们可以改变它的尺寸,对它进行移动,也可以随时关闭它。

若从程序员的角度来看,视实际上是一个从MFC 类库中的Cview 类所派生出的类的对象。

文档对象是用来保存数据的,而视对象是用来显示数据的,并且允许对数据进行编辑。

SDI 或MDI 的文档类是由Cdocument 类派生出来的,它可以有一个或多个视类,而这些视类最终都是由Cview 类派生出来的。

视对象只有一个与之相联系的文档对象,它所包含的CView::GetDocument 函数允许应用在视中得到与之相联系的文档,据此,应用程序可以对文档类成员函数及公共数据成员进行访问。

如果视对象接受到了一条消息,表示用户在编辑控制中输入了新的数据,此时,视就必须通知文档对象对其内部数据进行相应的更新。

如果文档数据发生了变化,则所有的视都必须被通知到,以便它们能够对所显示的数据进行相应的更新。

Cdocument::UpdateAllViews 函数即可完成此功能。

当该函数被调用时,派生视类的CView::OnUpdate 函数被触发。

通常OnUpdate 函数要对文档进行访问,读取文档数据,然后再对视的数据成员或控制进行更新,以便反映出文档的变化。

另外,还可以利用OnUpdate 函数使视的部分客户区无效,以便触发Cview::OnDraw 函数,利用文档数据来重新对窗口进行绘制。

在MDI 应用程序中,可以处理多个文档类型,即多个文档模板,每个模板又可以有多个文档,每个文档又可以多视显示。

为管理方便,上一级往往保留了下一级的指针列表。

如图(2)所示:解释如下:(1)、每个应用程序类(CwinApp的派生类)都保留并维护了一份所有文档模板的指针列表,这是一个链表结构。

应用程序为所要支持的每个文档类型动态分配一个CMultiDocTemplate 对象,CmultiDocTemplate(UINT nIDResource,CruntimeClass * pDocClass,CruntimeClass * pFrameClass,CruntimeClass * pViewClass );并在应用程序类的CWinApp::InitInstance成员函数中将每个CMultiDocTemplate对象传递给CWinApp::AddDocTemplate。

该函数将一个文档模板加入到应用程序可用文档模板的列表中。

函数原形为:void AddDocTemplate(CdocTemplate * pTemplate);应用程序可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置,利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。

函数原形如下:POSITION GetFirstDocTemplate( ) const;CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;第二个函数返回由pos 标识的文档模板。

POSITION是MFC定义的一个用于迭代或对象指针检索的值。

通过这两个函数,应用程序可以遍历整个文档模板列表。

如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。

(2)、一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。

应用程序可以用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。

函数原形为:viaual POSITION GetFirstDocPosition( ) const = 0;visual Cdocument *GetNextDoc(POSITION & rPos) const = 0;如果列表为空,则rPos被置为NULL.(3)、在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。

函数原形如下:CDocTemplate * GetDocTemplate ( ) const;如果该文档不属于文档模板管理,则返回值为NULL。

(4)、一个文档可以有多个视。

每一个文档都保留并维护一个所有相关视的列表。

CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表中,并将视的文档指针指向该文档。

当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视的对象连接到文档上时,MFC会自动调用该函数,框架通过文档/视的结构将文档和视联系起来。

当然,程序员也可以根据自己的需要调用该函数。

Virtual POSITION GetFirstViewPosition( ) const;Virtual CViw * GetNextView( POSITION &rPosition) cosnt;应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。

如果找到的视为列表中的最后一个视,则将rPosition置为NULL.当在文档上新增一个视或删除一个视时,MFC会调用OnChangeViewList函数。

如果被删除的视是该文档的最后一个视,则删除该文档。

(5)、一个视只能有一个文档。

在视中,调用CView::GetDocument可以获得一个指向视的文档的指针。

函数原形如下:CDocument *GetDocument ( ) const;如果该视不与任何文档相,则返回NULL.(6)、MDI框架窗口通过调用CFrameWnd::GetActiveDocument 可以获得与当前活动的视相连的CDocument 指针。

函数原形如下:virtual CDocument * GetActiveDocument( );(7)、通过调用CFrameWnd::GetActiveView 可以获得指向与CFrameWnd框架窗口连接的活动视的指针,如果是被CMDIFrameWnd框架窗口调用,则返回NULL。

MDI框架窗口可以首先调用MDIGetActive找到活动的MDI子窗口,然后找到该子窗口的活动视。

函数原形如下:virtual Cdocument * GetActiveDocument( );(8)、MDI框架窗口通过调用CFrameWnd::GetActiveFrame, 可以获得一个指向MDI框架窗口的活动多文档界面子窗口的指针。

(9)、CMDIChildWnd调用GetMDIFrame获得MDI框架窗口(CMDIFrameWnd)。

(10)、CWinApp 调用AfxGetMainWnd得到指向应用程序的活动主窗口的指针。

下面一段代码,就是利用CDocTemplate、CDocument和CView之间的存取关系,遍历整个文档模板、文档以及视。

相关文档
最新文档