如何在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;
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 实现。
由文档模板将文档、浏览窗口和框架窗口三者联系起来。
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简介Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。
为了能充分利用这些特性,你必须理解C++ 程序设计语言。
掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。
该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。
这种层次结构适用于所有版本的Windows 并彼此兼容。
你用MFC 所建立的代码是完全可移植的。
简单介绍MFC的基本概念和术语以及事件驱动程序设计方法。
输入、编译和运行一个简单的MFC程序。
第二部分中将详细解释这些代码。
第三部分讨论了MFC控件和如何定制它们。
什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。
首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。
Windows 用户界面有一些标准的控件,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。
要记住的是,作为程序员必须选择一组控件并决定如何把它们安排到屏幕上。
传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
下一步,是要实现代码。
为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。
使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。
该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。
对于Windows NT, API 被称为"Win32 API",以区别于其用于Windows 3.1的16位API, Microsoft 也提供了C++ 库,它位于任何Windows API 之上,能够使程序员的工作更容易。
MFC多文档和单文档视结构
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的新建函数就是调用子类虚函数。
如何在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将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
MFC单文档及其简介
MFC是一个编程框架MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。
MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
AppWizard可以用来生成初步的框架文件。
资源编辑器用于帮助直观的设计用户接口。
ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。
而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。
框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。
1.S DI生成1.步骤dxq2009首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。
(1)第一步用于选择应用的结构以及语言等。
如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。
上面3个单选按钮用于确定创建的应用类型,包括单文档,多文档,对话框,这里选择第一个。
然后从资源列表框选择应用所使用的语言种类,单击“Next”。
图1(2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。
图2(3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”图4(4)第四步用于选择应用所需的基本用户接口特征,以及所想使用的工具栏类型,如图5,如果想要修改应用所使用的文件名和扩展名,或者想要调整应用的用户接口和框架风格,就单击“Advanced”,然后修改,一般默认,单击“Next”。
MFC---视图和窗口
MFC---视图和窗⼝视类窗⼝是指程序运⾏后,显⽰信息的那⼀部分。
对应的类是CTestOneView (TestOne 表⽰项⽬名称)类,CTestOneView 类是派⽣于CView 类,⽽CView 类⼜派⽣于CWnd 类。
他们的继承关系可以通过查找类的定义来查看继承关系。
视图类CView ,拥有窗⼝的客户区域,负责显⽰⽂档数据,接受⽤户的输⼊,提供⽂档与⽤户的通信。
视类窗⼝只是主框架窗⼝中空⽩的部分。
主框架窗⼝是指程序运⾏后,程序的整个界⾯。
对应的类是CMainFrame ,CMainFrame 类派⽣于CFrameWnd 类,⽽CFrameWnd 类⼜⼜派⽣于CWnd 类。
主框架窗⼝就是整个应⽤程序外框所包括的部分,主框架窗⼝是视类窗⼝的⼀个⽗窗⼝。
⽂档类CDcoument ,负责维护应⽤程序所需要的数据,提供⼀系列可对这些数据进⾏操作的⽅法,并且能够为视图提供所需的数据。
新建⼀个MFC 单⽂档应⽤程序,项⽬名称为SDITest 。
从项⽬结构中可以看到SDITest 程序中还有⼀个CSDITestDoc 类,它派⽣于CDocument 类,CDocument 类的基类是CCmdTarget ,⽽CCmdTarget ⼜派⽣于CObject 类,从⽽可知这个CSDITestDoc 类不是⼀个窗⼝类,实际上是⼀个⽂档类。
MFC 提供的⽂档/视(Document/View )结构,能够把数据本⾝与它的显⽰分离开,其中⽂档是指CDocument 类,视类是指CView 类。
数据的存储和加载由⽂档类来完成,数据的显⽰和修改则由视类完成,从⽽把数据的管理和显⽰⽅法分离开来。
下⾯介绍⼀下MFC 单⽂档程序是如何将⽂档类对象、框架对象、视类对象组织在⼀起的。
在源⽂件SDITest.cpp 中找到CSDITestApp 类的InitInstance 函数定义,有下⾯这⼀段代码:从上⾯的代码段中可知,定义了⼀个单⽂档模板对象指针pDocTemplate ,这个对象把⽂档对象、框架对象、视类对象有机地组织在⼀起,形成了⼀个有机的整体,程序接着利⽤AddDocTemplate 函数把这个单⽂档模板添加到⽂档模板中,从⽽把这三个类组织为⼀个整体。
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 ctreeview用法
mfc ctreeview用法MFC CTreeView 是Microsoft Foundation Classes(MFC)中的一个类,用于创建和管理树形视图控件。
树形视图控件是一种常用的界面控件,它通常用于展示层级结构的数据,如文件系统,项目组织或数据库表等。
在本文中,我们将一步一步介绍如何使用MFC CTreeView 创建和管理树形视图控件,包括创建视图类,初始化树形视图,添加节点,展开和折叠节点以及响应节点的选择事件等。
第一步:创建视图类首先,在MFC 应用程序中创建一个新的视图类,以用于展示树形视图控件。
可以使用Visual Studio IDE 中的“添加类”功能来创建视图类。
确保选择“CFormView”为基类,并为视图类命名,例如“CTreeViewDemoView”。
第二步:添加树形视图控件到视图中在视图类的头文件中声明一个CTreeView 对象,以用于管理树形视图控件。
可以使用类向导或手动添加以下代码:cppclass CTreeViewDemoView : public CFormView{...CTreeView m_treeView;...};然后,在视图类的初始化过程中,创建树形视图控件并将其添加到视图中。
可以在OnInitialUpdate 方法中添加以下代码:cppvoid CTreeViewDemoView::OnInitialUpdate(){CFormView::OnInitialUpdate();初始化树形视图控件CRect rect;GetClientRect(&rect);m_treeView.Create(WS_VISIBLE WS_CHILD TVS_HASLINES TVS_LINESATROOT TVS_HASBUTTONS, rect, this, 0);...}第三步:初始化树形视图在树形视图控件创建并添加到视图中后,我们需要初始化树形视图的数据。
MFC如何创建多按钮功能的界面
MFC如何创建多按钮功能的界面最终的效果如下:点击按钮“方块”,弹出方块设置对话框,输入值然后点OK时,绘画方块图像;点击按钮“三角”,同样弹出三角设置对话框然后点OK时,绘画三角图像。
下面介绍制作步骤:一、创建一图形显示界面二、创建两图形显示界面三、创建三图形显示界面四、创建四图形显示界面1.打开visual C++,点“文件”,“新建”,“MFC AppWizard(exe)”,“工程名称”,“位置”,“确定”“基本对话框”“完成”2.得到如图:按照我的习惯,“确定”“取消”和“TODO”全部删掉,如图:3. 创建三个按钮和一个静态文本,分别命名“方块”“三角”“OK”。
静态文本清空,其属性里“扩展样式”“静态边缘”打勾。
他们的ID分别为:IDC_fang,IDC_san,IDC_OK,IDC_DRAW。
如图:4. 双击“方块”按钮,点“确定”,然后输入代码:void CTest425Dlg::Onfang(){ // TODO: Add your control notification handler code hereextern int flag;flag=1;}其中变量flag的作用是用来标志,用来判断接下来点“OK”的时候,执行哪种操作。
因为是全局变量,所以加上了extern同样,双击“三角”按钮,输入代码:void CTest425Dlg::Onsan(){ // TODO: Add your control notification handler code hereextern int flag;flag=2;}当然,如果我们需要更多功能时,可以绘制更多的按钮,然后给他们flag=3,flag=4等等的赋值。
5. 双击“OK”按钮,输入代码前半段:void CTest425Dlg::OnOk(){ // TODO: Add your control notification handler code hereextern int flag;CWnd *pWnd=GetDlgItem(IDC_DRAW);CDC *pDC=pWnd->GetDC();CBrush WhiteBrush;WhiteBrush.CreateSolidBrush(RGB(255,255,255));CRect rect;pWnd->Invalidate();pWnd->UpdateWindow();pWnd->GetClientRect(&rect);}这些代码的作用是初始画图功能。
第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的派生视图类的对象指针
MFC教程
01章用向导创建文档窗口MFC教程是小雅最怕写的内容,除了水平问题之外,还有一点就是,MFC将许多程序封装起来,使众多程序员在编程时,即使编出了程序,也不知究竟为什么这样就可以了。
这一现象使小雅想到当今的Java程序员,许多人在开发外包项目时,因为整个FrameWork已经建成,自己只是担当其中一部分功能,出了BUG之后,找原因非常困难。
在SDK教程中,小雅将各种功能进行详细解说,而MFC教程中,只是用例子来讲解MFC的原理,学会原理之后,就会感到MFC比SDK编程省了许多事。
小雅在SDK教程中,为了讲明API功能,用的方法都是C语言的方法,而MFC用的全是C++的内容,因此,学习MFC必须对C++有较深的了解,不会C语言、C++语言而能够学会MFC的人只能是吹牛。
小雅的“C语言教程”和“C++语言教程”都是按照标准C/C++来写的,在Unix、Linux、Windows都适用,这是很重要的基础。
SDK教程主要是让初学者明白WindowsAPI的功能,以及程序的实现方法,基本上是“C语言+ API”,而MFC基本上是“C++ + API”。
SDK编程和MFC是可以相互转化,相互调用的,因为MFC 封装了绝大部分API,但不是所有的API函数。
注意:SDK并不是只能用C语言来写,用C++一样编程,小雅在作教程时为了把内容说清楚,同时兼顾不会C++的人员才使用C语言。
对于初学者,小雅建议在C/C++的基础上用MFC来编程,一是省去了很多编程,二是用上了C++的面向对象编程的思想。
当今要找一个C++的项目来一边做一边学是很困难的。
小雅自己也一直想找一个C++的工作而未能如愿。
通过学习MFC 再反过来加强一下学的不是很深的C++,不是很好的一个方法吗?不过,MFC和SDK与C/C++不同点在消息事件处理方面,初学者要学会这一内容。
关于“”有“托管”和“非托管”二种编程方式,小雅的SDK教程和MFC教程全部是“非托管”编程,也就是传统编程。
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学习总结 (67个技巧) dlg 上建立View
MFC学习总结(67个技巧) dlg 上建立View1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);属性页的添加完成。
如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align 项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class 里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120); ""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar,ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。
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)。
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的学习和开发,更是面对一堆的代码不知所措。
4.创建一个切分类,如MySplitter,基类为CSplitterWnd(默认基类选项中无此类,自己添加即可)。
5.在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作)。
6.重写框架类Cmainframe的OnCreateClient函数,如下:
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
pDC->FillSolidRect(rc,RGB(128,128,128));
pDC->Draw3dRect(rc,RB,RB);
return;
case splitBar:
补充内容:
a. 此时创建的各个子视图之间的分割条可以拖动,以改变视图其大小。如果想固定分割条,则需要重载MySplitter类的鼠标响应函数。可以通过一个Bool型变量来控制是否可以拖动分割条:
if (Isvisable) //Isvisable在构造函数中已被初始为FALSE
{
CSplitterWnd::OnLButtonDown(nFlags, point);
1 必备基础知识概述
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)的主要组成:
!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) ||
// return CFrameWnd::OnCreateClient(lpcs, pContext); //注释掉原有的响应函数
注意:记得在Mainfrm.h中添加以上五个视图类的头文件:
#include "CControlForm.h"
#include "TopLView.h"
u 一个App(对应类CAApp)可以包含多个文档模版(CDocTemplate),但是MFC AppWizard(无论是SDI还是MDI)都只是默认生成一个。但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。这个结构是通过MFC中CWinApp的成员变量CDocManager* m_pDocManager实现的,我们的CAApp正是继承自MFC提供的CWinApp类。
!m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
[注解]:①MFC SDI/MDI程序默认都默认生成了一个文档模版,并将这个文档模版Add到其文档模版的链表中,由于这是MFC默认提供的,因此这个文档模版会被插入到文档模版的第一个位置,而MFC也是通过这个文档模版的特定位置可以确定的。默认情况下,当我们点击File(Open)/ File(New)的时候,这个文档模版会被启用。
}
b. 还可以通过重载MySplitter类的OnDrawSplitter函数来改变分割条的样式。以下为该函数代码:
{
#define LP RGB(128,128,128)
#define RB RGB(192,192,192)
//如果pDC 为 NULL则仅使分割窗口区域无效
if (pDC == NULL)
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
pDC->Draw3dRect(rc,RB,RB);
return;
case splitBox:
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
【转】MFC 多文档
2010-01-11 17:23
如何在MFC单文档中创建多视图
基本步骤如下:
1.首先创建一个MFC单文档应用程序。
2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基类为CView。
3.添加一个MFC类CControlForm,基类为CFormView,对话框ID默认。
#include "TopRView.h"
#include "BottomLView.h"
#include "BottomRView.h"
6. 切分视图完成,结果如下:
其中,最左的视图为FormView类型,操作类似对话框(可以在Resource-Dialog看到其对应的对话框资源);右边四个的操作则类似普通视图。
//重画分割条
pDC->FillSolidRect(rc,RGB(192,192,192));
rc.InflateRect(-1,-1);
pDC->Draw3dRect(rc,RB,RB);
return;
default:
ASSERT(FALSE);
ห้องสมุดไป่ตู้
u CDocManager类则拥有一个指针链表CPtrList m_templateList来维护这些文档模版。这些文档模版都是在CAApp::InitInstance()中通过AddDocTemplate(pDocTemplate)。
u CDocTemplate拥有3个成员变量,分别保存着Document、View、Frame的CRuntimeClass指针,另外持有成员变量m_nIDResource,用来指定这个Document显示时候采用的菜单资源。这4份数据都在CAApp::InitInstance()中CDocTemplate的构造函数中指定。在Document中拥有一个回指CDocTemplate的指针(m_pDocTemplate)。
}
//填充中间的部分
pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));
}
/mplsfec/blog/item/025b1c63d939fad4e7113ad4.html
//第一次静态切分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) ||
{
RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);