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)指针
文档模板 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++文档和视图
第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编程基础
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单文档中创建多视图
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编程基础教程第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: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应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。
不需要的朋友可以从第二部分程序设计开始看起。
目录基于单文档的窗口分割 (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框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据在MFC的单文档里,每个类都有获得其他类指针的一套方法每个类都有获得其他类指针的一套方法.现归纳如下.为方便说明,现假设已用app wizard生成了一个SDI应用程序test,包含如下几个类: CT estApp,CTestDoc,CTestView,CMaimFrame 1:从视图类获得文档类指针如前所述,在视图类中需要引用文档类的地方之前,使用如下语句: CTestDoc *pDoc=(CTestDoc *)GetDocument();以后便可使用pDoc指针访问文档类.此处的强制类型转换在test应用程序中并不需要,因为该程序只有一个视图类,并且在InitInstance()重用SDI文档模板进行了装配.你可以在Test.cpp种的InitInstance()方法中看到如下语句:CSingleDocTemplate *pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINRAME,RUNTIME_CLASS(CTe stDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);以及TestView.h中的定义:inline CTestDoc *CTestView::GetDocument(){return (CTestDoc *)m_pDocument;}简而言之,就是说CT estView的GetDocument()函数自然而然的认为CTestDoc是与它"相配"的.当生成了一个具有多个视图类的应用程序时,(如用CSplitterWnd将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
cmultidoctemplate构造函数
在深入探讨cmultidoctemplate构造函数之前,让我们先来了解一下它的背景和作用。
cmultidoctemplate构造函数是MFC中的一个类,它用于管理多文档应用程序的文档模板。
在MFC中,多文档应用程序是一种常见的应用程序类型,它可以同时打开并管理多个文档窗口。
cmultidoctemplate构造函数的作用就是为这些文档窗口提供模板,以便程序能够正确地创建和管理它们。
对于cmultidoctemplate构造函数的深入理解,我们可以从以下几个方面来进行全面评估:1. 构造函数的参数和用法:我们需要了解cmultidoctemplate构造函数的参数和用法。
通常情况下,它会接受几个参数,包括指向文档类和视图类的指针,以及用于创建文档窗口的默认名称等。
了解这些参数的具体含义和用法,可以帮助我们更好地理解构造函数的实际作用和功能。
2. 构造函数的内部机制:我们还需要深入了解cmultidoctemplate构造函数的内部机制。
也就是说,我们需要了解它是如何通过参数和成员变量来实现文档模板管理的。
这一部分可能涉及到一些MFC内部的实现细节,但对于我们更全面地理解构造函数的工作原理十分重要。
3. 构造函数的调用流程:另外,我们还可以探讨一下cmultidoctemplate构造函数在实际调用过程中的具体流程。
也就是说,当我们创建一个多文档应用程序时,构造函数是如何被调用并起作用的。
这将有助于我们理解构造函数与整个多文档应用程序框架的关系。
总结回顾一下,cmultidoctemplate构造函数是MFC中一个重要的类,它用于管理多文档应用程序的文档模板。
通过对构造函数的参数、内部机制和调用流程进行深入评估,我们可以更全面地了解它的作用和功能。
个人观点上,我认为深入理解这一构造函数对于MFC开发者来说十分重要,它可以帮助他们更好地利用MFC框架来开发多文档应用程序。
感谢你的阅读,希望本文能够对你有所帮助。
MFC文档与视图深入详解
1.1 MFC 文档视图结构程序结构总揽当我们使用MFC AppWizard 生成一个MFC 程序,选用所有默认的设置(当然也是Multiple Documents ,本文讨论主要基于Multiple Documents ,对于Single Document 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。
),假设你的程序名称为A ,则你会得到CMainFrame 、CChildFrame 、CAboutDlg 、CADoc 、CAView 、CAApp 6 个类(Single Document 仅少一个CChildFrame 类,其余均同)。
这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App )的主要组成:一个App (对应类CAApp )可以包含多个文档模版(CDocTemplate ),但是MFC AppWizard (无论是SDI 还是MDI )都只是默认生成一个。
但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。
这个结构是通过MFC 中CWinApp 的成员变量CDocManager*m_pDocManager 实现的,我们的CAApp 正是继承自MFC 提供的CWinApp 类。
CDocManager 类则拥有一个指针链表CPtrList m_templateList 来维护这些文档模版。
这些文档模版都是在CAApp ::InitInstance ()中通过AddDocTemplate(pDocTemplate) 。
CDocTemplate 拥有3 个成员变量,分别保存着Document 、View 、Frame 的CRuntimeClass 指针,另外持有成员变量m_nIDResource ,用来指定这个Document 显示时候采用的菜单资源。
这4 份数据都在CAApp ::InitInstance ()中CDocTemplate 的构造函数中指定。
MFC显示多张图的方法
如何使用MFC显示多张图片1、打开VS2008软件,创建一个MFC对话框应用程序(Dialog-based Application),在名称栏输入创建项目的名称,点击“确定”。
如下图所示:在出现的“MFC应用程序向导”对话框内,选择“基于对话框”,并取消“使用Unicode库(N)”其他选项不做修改,单击“下一步”,如下图所示:一直点击“下一步”到“生成的类”对话框,选择基类为“CDialog”单击完成即可创建一个MFC对话框。
如下图所示:2、点击删除3、添加控件并导入图片生成如下图所示的初始的GUI界面,在工具箱中单击“Picture Control”,将鼠标移动到GUI界面内,这样就在此界面添加了一个Picture控件。
并修改其类型为,ID改为IDC_PICTURE。
4、接着,在“资源视图”下,右击选择“添加资源”,在“添加资源”对话框的“资源类型”下选择“Bitmap”,再单击“导入(M)”,打开BMP图片。
如下图所示:5、导入图片后,如图,同时修改第四张图的ID为IDB_busyman(点击第四张图在其属性栏中修改)如图,6、点击图中青色图标在其属性栏中的“Image”中后面填上IDB_busyman7、点击运行,检验MFC显示一张图片是否正确,运行后如图8、说明正确,点击确定。
然后点击工具栏中的往上图中添加此按钮如图9、修改其ID为IDC_COMBO_SELECTPIC,点击控制事件按钮,并在添加OnCbnSelchangeComboSelectpic()10、右击图中添加变量名为m_choice11、右击类视图下的添加变量类型都为CBitmap,变量名分别为m_Bmp1,m_Bmp2,m_Bmp3,m_Bmp4的四个变量。
12、右击上图中的照片右击添加变量,变量名为m_PicChoiced13、在解决方案管理器中选择,在下面添加:CString strTemp;((CComboBox*)GetDlgItem(IDC_COMBO_SELECTPIC))->ResetContent();for(int i = 1; i<5; i++){strTemp.Format("Picture %d",i);((CComboBox*)GetDlgItem(IDC_COMBO_SELECTPIC))->AddString(strTemp);}m_choice.SetCurSel(0);m_Bmp1.LoadBitmap(IDB_busyman);m_Bmp2.LoadBitmap(IDB_BITMAP1);m_Bmp3.LoadBitmap(IDB_BITMAP2);m_Bmp4.LoadBitmap(IDB_BITMAP3);14、在OnCbnSelchangeComboSelectpic()下添加:int CurSel = m_choice.GetCurSel();switch (CurSel){case 0:m_PicChoiced.SetBitmap(m_Bmp1);break;case 1:m_PicChoiced.SetBitmap(m_Bmp2);break;case 2:m_PicChoiced.SetBitmap(m_Bmp3);break;case 3:m_PicChoiced.SetBitmap(m_Bmp4);break;default:break;} // TODO: 在此添加控件通知处理程序代码15、点击运行即可见到如下图:。
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框架窗口之前首先分派给当前活动子窗口。
mfc项目开发实例85个
mfc项目开发实例85个全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Classes)是一种面向Windows操作系统开发的图形用户界面应用程序框架,它是微软公司推出的一种软件开发工具,为开发人员提供了一系列类和函数,用于快速、简便地创建Windows应用程序。
在本文中,我们将介绍一些MFC项目开发的实例,希望对MFC开发者有所启发和帮助。
一、MFC项目开发实例之文件操作1. 创建一个MFC项目,实现文件的读取和写入功能。
可以通过CFile类来实现文件的打开、读取、写入和关闭操作。
2. 创建一个MFC项目,实现文件夹的遍历和文件的拷贝功能。
可以使用CFileFind类来查找文件和文件夹,使用CopyFile函数来实现文件的拷贝。
6. 创建一个MFC项目,实现数据库连接和查询功能。
可以使用CDatabase类和CRecordset类来连接数据库和执行SQL查询。
11. 创建一个MFC项目,实现多文档视图窗口的创建和切换功能。
可以通过CMDIChildWnd类和CDocument类来创建多文档视图窗口。
12. 创建一个MFC项目,实现对话框的创建和控件的添加功能。
可以通过CDialog类和CWnd类来创建对话框,使用CButton类、CEdit类和CListCtrl类等控件来添加在对话框中。
13. 创建一个MFC项目,实现菜单和工具栏的添加和事件处理功能。
可以通过CMenu类和CToolBar类来添加菜单和工具栏,使用消息映射来处理菜单和工具栏事件。
14. 创建一个MFC项目,实现状态栏和进度条的显示和更新功能。
可以通过CStatusBar类和CProgressCtrl类来创建状态栏和进度条,使用SetPaneText和SetPos函数来更新状态栏和进度条。
15. 创建一个MFC项目,实现动画和图像显示功能。
可以使用CImageList类和CAnimateCtrl类来实现动画和图像的显示。
基于MVC的软件界面体系结构研究与实现
收稿日期:2003-09-08;修返日期:2003-10-28基金项目:国家 863 计划资助项目(2003AA118105)基于MVC 的软件界面体系结构研究与实现*王映辉1,王英杰2,王彦君3,樊宏斌4(1.陕西师范大学计算机学院,陕西西安710062; 2.中国科学院地理科学与资源研究所,北京100101; 3.中国石油测井有限公司长庆事业部,陕西高陵710000; 4.西北大学计算机系,陕西西安710069)摘 要:软件体系结构研究是目前软件工程领域研究的新一轮热潮,是对软件的更高层次抽象。
在分析MVC (Model/Vie w/Controller)模式机理的基础上,给出了基于MVC 的软件界面体系结构及其工作机理。
软件界面体系结构带来了软件设计的灵活性和高度重用性。
最后,以软件界面体系结构为指导,分析了MFC(Mic rosoft Funda ment Cla ss)的文档视图结构,并给出了软件界面体系结构的具体设计和实现。
关键词:软件体系结构;模型/视图/控制器模式;文档;视图中图法分类号:TP311 13 文献标识码:A 文章编号:1001-3695(2004)09-0188-03Study on Architecture of Software Interface Based on MVCWANG Ying-hui 1,WANG Ying-jie 2,WANG Yan-jun 3,FAN Hong-bin 4(1.College o f Com pute r Science ,Shanxi No rmal U nive rsity ,Xi !an Shanxi 710062,China ;2.Institute o f Geosciences &Resource ,Chinese Ac ademy o f Sc ienc e ,Bei jing 100101,China;3.Changqing Departme nt,China Pe troleum Logging Co.,Ltd ,Gaoling Shanxi 710000,China ;4.Dept.o f Com puter Sc ienc e ,No rthwest U ni versity,Xi !an Shanxi 710069,China)A bstract:Study on software archi tecture is a new upsurge in software engineerin g field.Software architecture is a higher level abstract of software.Analysis theory of MVC,then get the architecture of soft ware interface and make clear the theory of archi tecture of software in terface.Archi tecture of software interface bri ng the flexi bility and reusability of software design.At last,analyze the structure of docu ment/view of MFC,then demon strate implementation of MVC-oriented archi tecture of software i nterface based MFC.Key w ords:Software Architecture(SA);Model/View/Controller(MVC)Pattern;Docu ment;View1 引言软件体系结构(Software Architecture,SA)是目前软件工程领域的一个研究热点[1~3,10,11]。
mfc ceditview实例
mfc ceditview实例全文共四篇示例,供读者参考第一篇示例:MFC CEditView(多文本编辑框视图)是Microsoft Foundation Class(MFC)库中的一个类,用于在应用程序中显示和编辑文本。
它提供了一个易于使用和定制的界面,使用户能够轻松地输入、编辑和查看文本信息。
在本文中,我们将介绍如何使用MFC CEditView类创建一个简单的文本编辑器实例。
我们需要创建一个新的MFC应用程序项目。
在Visual Studio 中,选择“文件” -> “新建” -> “项目”,然后选择“MFC 应用程序”模板。
在向导中,选择“单文档应用程序”类型,并确保勾选“生成视图”和“支持MFC 功能”选项。
点击完成按钮后,Visual Studio 将自动生成一个基本的MFC应用程序框架。
```cppclass CMyEditView : public CEditView{protected:CMyEditView(); // 隐藏的构造函数DECLARE_DYNCREATE(CMyEditView)``````cppIMPLEMENT_DYNCREATE(CMyEditView, CEditView)CMyEditView::CMyEditView(){}if (!m_wndSplitter.CreateView(0, 0,RUNTIME_CLASS(CMyEditView), CSize(0, 0), pContext) ||!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CListView), CSize(0, 0), pContext)){m_wndSplitter.DestroyWindow();return FALSE;}SetActiveView((CView*)m_wndSplitter.GetPane(0, 0));return TRUE;}通过上述代码,我们创建了一个名为CMyEditView的自定义CEditView类,并将其添加到应用程序的主视图中。
单文档实现多视图
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));
MFC单文档实现多视图
一.介绍:多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式:1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。
2)通过一个文档关联多个视图,窗口显示整个视图。
第二种实现较第一种复杂,这里给出详细的实现方法。
二.实现步骤: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 的实现:CMultiViewDoc* CAnotherView::GetDocument(){return (CMultiViewDoc*)m_pDocument;}Step 3:在CMultiViewApp添加成员变量记录这两个视图:private:CView* m_pFirstView;CView* m_pAnotherView;给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数:voidCMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview()Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码://创建一个新的视图CView* m_pActiveView =((CFrameWnd*)m_pMainWnd)->GetActiveView();m_pFirstView = m_pActiveView;m_pAnotherView = new CAnotherView();//文档和视图关联CDocument* m_pDoc =((CFrameWnd*)m_pMainWnd)->GetActiveDocument();CCreateContext context;context.m_pCurrentDoc = m_pDoc;//创建视图UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1;CRect rect;m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,m _IDFORANOTHERVIEW,&context);Step 5:现在已经创建了视图,并且都和文档关联起来了。
OpenCASCADE6.7.0创建单文档多视图
pDocTemplate2D = new CMultiDocTemplate(IDR_MyViewerTYPE, RUNTIME_CLASS(CMyViewerDoc), RUNTIME_CLASS(/*CChildFrame*/CChildFrm2D),
if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_3dCHILDFRAME)) {
改成下面的形式
#include "OCC_BaseChildFrame.h"
class CChildFrame : public /*CMDIChildWnd*/OCC_BaseChildFrame {
20. 对 MyViewerView.h 做如下修改
#include "OCC_3dView.h"
20. 添加两个类,通过右键单击→【类向导】,来添加两个类,方法如下图。
将这两个类的代码修改成如下的形式。 新添加的 View 类修改成下面的形式:
#include "OCC_2dView.h"
class CMyViewerView2D : public /*CView*/OCC_2dView {
10. 下面将设置工程的属性,可以通过在工程上单击右键,选属性,弹出属性页对话框, 在对话框中进行设置。首先修改包含目录,如下图所示,
11. 添加 WNT
12. 添加 lib 库
lib 库如下: TKBRep.lib FWOSPlugin.lib PTKernel.lib TKBool.lib TKCAF.lib TKCDF.lib TKernel.lib TKFeat.lib TKFillet.lib TKG2d.lib TKG3d.lib TKGeomAlgo.lib TKGeomBase.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV3d.lib TKOpenGl.lib mfcsample.lib
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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之间的存取关系,遍历整个文档模板、文档以及视。