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

合集下载

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中的文挡/视结构李泽宇金刚熊联欢姜军(华中理工大学图象识别与人工智能研究所)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控件使用详细教程MFC(Microsoft Foundation Class)是微软推出的一套用于开发Windows应用程序的类库。

它提供了许多方便易用的控件,可以快速创建用户界面。

本教程将详细介绍如何使用MFC控件来创建Windows应用程序。

第一步:创建一个MFC应用程序项目要使用MFC控件,首先需要创建一个MFC应用程序项目。

在Visual Studio中,选择"文件"->"新建"->"项目",然后选择"MFC应用程序"模板。

在项目设置中,可以选择使用对话框或视图来作为应用程序的主界面。

第二步:设置控件属性第三步:添加控件消息处理程序控件不仅仅可以显示在界面上,还可以响应用户的操作。

例如,当用户点击按钮时,可以执行一些特定的操作。

要实现这个功能,需要添加控件消息处理程序。

可以通过右键单击控件,选择"添加事件处理程序"来添加控件消息处理程序。

在生成事件处理程序的对话框中,可以选择控件的事件(如点击事件、鼠标移动事件等)和消息的处理函数。

在消息处理函数中,可以编写代码来实现特定的功能。

第四步:编写控件的功能代码在控件的消息处理函数中,可以使用MFC类库提供的函数来实现控件的功能。

例如,如果用户点击了按钮控件,可以使用CButton类的GetWindowText函数来获取按钮的文本,并使用CMessageBox类的MessageBox函数来显示一个消息框。

可以使用类似的方式来处理其他控件的事件。

例如,当用户选择了一个列表框中的项时,可以使用CListBox类的GetCurSel函数来获取选择的项的索引,并根据索引来执行特定的操作。

第五步:编译和运行应用程序完成了控件的添加和功能编写后,可以使用Visual Studio的编译和运行功能来编译和运行应用程序。

在编译过程中,会生成可执行文件和相关的依赖文件。

MFC的六大机制

MFC的六大机制

MFC的六⼤机制MFC的六⼤机制程序的初始化过程运⾏时类型识别动态创建永久保存消息映射命令传递运⾏时类型识别MFC的运⾏时类型识别就是在程序运⾏过程中判断某个对象是否属于某个类,MFC通过为需要进⾏运⾏时类型识别的类添加⼀个静态CRuntimeClass类对象,其属于此类⽽不是属于某⼀特定对象,其在没有实例化对象的时候就已经存在并且可以被使⽤。

struct CRuntimeClass{//省略其他⽆关的成员LPCSTR m_lpszClassName; //类的名称int m_nObjectSize; //类的⼤⼩CRuntimeClass* m_pBaseClass; //指向基类的CRuntimeClass对象CRuntimeClass* m_pNextClass; //指向同类型对象的CRuntimeClass对象};然后提供了⼀个能返回类⾃⾝CRuntimeClass对象地址的函数GetRuntimeClass()CRuntimeClass* class_name::GetRuntimeClass() const/{ return &class_name::class##class_name;}CObject类提供⼀个IsKindof虚拟函数,此函数通过从对象⾃⼰的CRuntimeClass成员对象开始往基类遍历,判断是否有CRuntimeClass成员对象等于待判断类的CRuntimeClass成员对象,有则说明此对象属于此类(也就是说此对象是此类或其派⽣类的实例),⽆则说明不属于此类。

BOOL CObject::IsKindof(const CRuntimeClass *pClass) const{CRuntimeClass* pClassThis=GetRuntimeClass();while(pClassThis != NULL){if(pClassThis==pClass)return TRUE;pClassThis=pClassThis->m_pBaseClass;}return FALSE;}例如:IsKindof()最后就会返回TRUE,因为MFC⾃⼰定义的类都实现了运⾏时类型识别,⽽所有的类都是从CObject中派⽣的,所以CWnd类的对象实例属于CObject类。

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 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。

mfc单文档例子

mfc单文档例子

mfc单文档例子以下是一个简单的MFC单文档(SDI)应用程序的示例:1. 首先,创建一个新的MFC应用程序项目。

在Visual Studio中,选择“文件”菜单,然后选择“新建”->“项目”。

在“新建项目”对话框中,选择“MFC应用程序”,然后输入项目名称和位置,并单击“确定”。

2. 在“MFC应用程序向导”中,选择“单文档”作为应用程序类型,并单击“完成”按钮。

3. 在生成的代码中,找到`CMainFrame`类。

这是应用程序的主窗口类。

4. 在`CMainFrame`类的`OnCreateClient`函数中,添加以下代码:```cppvoid CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext pContext){// 创建视图窗口m_(_T("My View"), WS_CHILD WS_VISIBLE WS_BORDERWS_HSCROLL WS_VSCROLL, CRect(0, 0, 800, 600), this,ID_VIEW_WIN);}```5. 在`CMainFrame`类的`OnCreate`函数中,添加以下代码:```cppBOOL CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;// 创建工具栏和状态栏CToolBarCtrl tb;CRect rect(0, 0, 800, 24);(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPERCBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPER CBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(this);m_(0, ID_VIEW_STATUSBAR, SBPS_STRETCH, 0);m_(1, ID_VIEW_STATUSBAR2, SBPS_STRETCH, 0);m_(2, ID_VIEW_STATUSBAR3, SBPS_STRETCH, 0);m_(0, SBPS_NORMAL);m_(1, SBPS_NORMAL);m_(2, SBPS_NORMAL);m_(0, _T("Ready"));m_(1, _T("Ready"));m_(2, _T("Ready"));return TRUE;}```6. 编译并运行应用程序。

如何在MFC中其他类访问和交换文档Doc类与视图View类的数据

如何在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把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。

这个工作在在应用程序初始化时完成,如下:[cpp]view plaincopy1.BOOL CMyHtmlApp::InitInstance()2.{3. CSingleDocTemplate* pDocTemplate;4. pDocTemplate = new CSingleDocTemplate(5. IDR_MAINFRAME,6. RUNTIME_CLASS(CMyHtmlDoc),7. RUNTIME_CLASS(CMainFrame), // main SDI frame window8. RUNTIME_CLASS(CMyHtmlView));9. AddDocTemplate(pDocTemplate);10. }单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。

你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。

多文档:就是你可以打开多个文件,和文档类型也无关。

你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。

何时需要文档/视图框架结构?首先你可以不使用文档视图这种框架结构,即便是在MFC中。

你可以在你需要的时候选择使用这种方式。

你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。

哪什么时候需要呢?当你想将你的数据层和界面层分开的时候。

通常我们对数据的操作放在文档类中,例如存取,打开,关闭。

在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新,那么程序会将你对数据所做的改变呈现给你的程序的用户。

mfc工作原理

mfc工作原理

mfc工作原理MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的应用程序框架,它在C++语言的基础上封装了一些常用的图形用户界面(GUI)功能,简化了Windows应用程序的开发过程。

本文将围绕MFC的工作原理展开阐述。

MFC的工作原理主要包括以下几个方面:1. 类库结构:MFC是一个面向对象的类库,它由一系列C++类组成。

这些类封装了Windows API的功能,提供了一种更加便捷的方式来创建和管理Windows应用程序。

MFC的类库结构包含了一些基本的类,如CObject、CWnd和CFrameWnd等,以及一些用于界面设计的类,如CButton、CEdit和CListBox等。

2. 消息映射机制:在MFC中,窗口类派生自CWnd类,通过消息映射机制来处理用户输入、系统消息等事件。

当用户操作窗口时,例如点击按钮、拖动滚动条等,系统会生成相应的消息,MFC会将这些消息映射到窗口类的成员函数上进行处理。

开发者只需重载对应的成员函数,就可以实现自定义的响应逻辑。

3. 对话框和控件:MFC提供了对话框和控件的封装,使得开发者可以方便地创建和管理用户界面。

对话框是一个独立的窗口,可以包含各种控件,如按钮、文本框、列表框等。

开发者可以使用MFC 提供的类来创建和设置对话框及其控件,通过消息映射机制来处理用户操作。

4. 文档视图模型(Document-View模式):MFC采用了文档视图模型来处理应用程序的数据和界面显示。

开发者可以通过MFC提供的类来创建文档类和视图类,文档类用于管理应用程序的数据,视图类用于显示和编辑数据。

MFC会自动处理文档和视图之间的关联,使得数据的修改能够实时反映到界面上。

5. 消息循环:MFC应用程序在启动后会进入一个消息循环,不断地接收和处理消息。

消息循环负责分发消息,并将消息传递给对应的窗口类进行处理。

MFC提供了一个消息映射表,用于将消息和相应的处理函数关联起来。

mfc cstatic getwindowtextw 使用方法

mfc cstatic getwindowtextw 使用方法

mfc cstatic getwindowtextw 使用方法MFC(Microsoft Foundation Class)是微软提供的一种基于Windows API的C++类库,它为开发者提供了许多方便的控件和功能,使得开发Windows应用程序变得更加容易。

在MFC中,CStatic是一个常用的控件,它通常用于显示静态文本或者图标。

然而,CStatic控件在实际应用中可能需要进行更复杂的操作,例如获取控件中的文本内容。

在这种情况下,我们可以使用CStatic控件的派生类CStaticCtrl,它提供了更多的功能和更好的扩展性。

本文将介绍如何使用MFC CStatic控件的派生类CStaticCtrl中的getWindowTextW函数来获取控件中的文本内容。

一、CStaticCtrl类概述CStaticCtrl是CStatic控件的派生类,它提供了更多的功能和更好的扩展性。

在CStaticCtrl类中,我们可以使用getWindowTextW函数来获取控件中的文本内容。

该函数的作用是从指定的控件中获取文本内容,并将其作为宽字符字符串返回。

二、使用方法要使用getWindowTextW函数,首先需要包含必要的头文件,并确保已经包含了MFC的相关库文件。

接下来,我们可以通过以下步骤来获取控件中的文本内容:1. 创建CStaticCtrl对象:首先需要创建一个CStaticCtrl对象,可以使用构造函数来初始化控件的属性。

例如:```cppCStaticCtrl myStaticCtrl;myStaticCtrl.Create(IDD_MYSTATICCTRL, CRect(0, 0, 0, 0), this);```上述代码创建了一个名为myStaticCtrl的CStaticCtrl对象,并使用Create函数初始化了该对象的属性。

2. 调用getWindowTextW函数:使用CStaticCtrl对象的getWindowTextW函数来获取控件中的文本内容。

MFC---视图和窗口

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中富文本框的使用

mfc中富文本框的使用

mfc中富文本框的使用MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的C++类库,用于简化Windows应用程序的开发。

在MFC中,富文本框是一种常用的控件,可以实现文本的格式化显示和编辑。

本文将介绍MFC中富文本框的使用方法和注意事项。

首先,在MFC应用程序中添加富文本框控件。

可以通过资源编辑器或代码方式添加富文本框控件。

在资源编辑器中,选择对话框模板,然后从工具箱中拖拽富文本框控件到对话框上。

在代码中,可以使用CWnd类的CreateEx函数创建富文本框控件。

接下来,设置富文本框的属性。

可以通过代码方式设置富文本框的属性,如字体、颜色、对齐方式等。

可以使用CFont类设置字体属性,使用SetTextColor函数设置文本颜色,使用SetSel函数设置选中文本的起始和结束位置,使用SetParaFormat函数设置段落格式等。

然后,处理富文本框的事件。

富文本框可以响应各种事件,如文本改变、鼠标点击、键盘输入等。

可以通过重写富文本框的消息处理函数来处理这些事件。

例如,可以重写OnEnChange函数来处理文本改变事件,重写OnLButtonDown函数来处理鼠标点击事件,重写OnChar函数来处理键盘输入事件等。

最后,注意一些使用富文本框的注意事项。

首先,富文本框控件的大小和位置应该合理设置,以适应窗口布局。

其次,富文本框控件的内容应该根据需要进行格式化,以便更好地展示文本。

此外,富文本框控件的性能较低,对于大量文本的显示和编辑,建议使用其他更高效的控件。

综上所述,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 ctreeview用法

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中文件操作、查找与选择总结

MFC总结(一):MFC中文件操作、查找与选择总结(1)本文主要涉及以下几个方面,均为在MFC编程中较为常用的:CFile操作、CArchive操作、如何选择文件和文件夹、如何查找文件、获取当前目录、_access函数等。

(一)使用CFile类操作文件CFile类在MFC的文件操作中应该是最常用的了。

主要的成员函数有Open、Close、Write、Read、Seek、SeekToEnd、GetLength、GetPosition,具体用法见MSDN。

(1)文件打开操作:文件打开有两种方式,一种是先定义类对象,在用Open函数打开;一种是在定义类对象时传入文件名和打开方式。

分别如下CFile file;if(!file.Open(lpszFileName, nOpenFlags ))return;或CFile file(lpszFileName, nOpenFlags);(2)文件打开方式:文件打开方式,即上述nOpenFlags的值主要由一些宏定义的值组合而成,具体见MSDN,常用的有如下几种:A. CFile::modeCreate | CFile::modeNoTruncate |CFile::modeWrite,以写文件的方式打开,如果文件不存在,则新建文件,否则打开已有文件进行写入操作,此时不会清空原有文件;B. 将上述CFile::modeWrite更换为CFile::modeRead或者CFile::modeReadWrite可实现读操作或者同时读写。

(3)判断文件结束判断文件是否结束,没有结束则继续读取,否则关闭退出。

这点在编程时常用。

对于CFile常用的判断文件结束的方法是:while(file.GetPosition() < file.GetLength()){ //文件未结束//Add code ....}(4)值得注意的几点:A. 当文件名中包含路径时,要注意使用\\,如C:\\MyFile.DAT,在Unicode下时,需要使用_T("C:\\MyFile.DAT");B. 采用(2)中A方式写文件时,注意使用file.SeekToEnd()将文件指针移至文件尾,再写入,否则会覆盖已有的数据,这点经常被很多初学者忽视;C. 在打开文件后就要紧接着写下Close,养成这样的习惯,避免忘记关闭文件。

MFC控件使用详细教程

MFC控件使用详细教程

MFC控件使用详细教程MFC(Microsoft Foundation Classes)是微软公司开发的一套面向对象的C++类库,旨在简化Windows应用程序的开发。

其中包括了一系列的控件类,用于构建Windows用户界面。

本文将介绍MFC控件的使用,并提供详细的教程。

1.创建MFC应用程序首先,打开Visual Studio开发环境,选择创建MFC应用程序项目。

在项目向导中,选择“对话框”应用程序类型。

2.添加控件到对话框在MFC应用程序中,用户界面的主要组成部分是对话框。

打开对话框资源文件(通常是一个名为“MainDlg”的文件),可以看到空白的对话框。

从工具箱中选择所需的控件,例如按钮(Button)、文本框(Edit Control)等。

点击工具箱中的控件,然后在对话框上绘制一个矩形,即可在对话框中添加该控件。

3.设置控件属性选中添加的控件,可以在“属性”窗口中设置其属性。

例如,可以设置按钮的文本、大小、位置等。

4.响应控件事件控件可以触发各种事件,例如按钮点击事件。

为了响应这些事件,我们需要添加相应的事件处理程序。

在资源视图中,右键点击对话框资源文件,选择“添加事件处理程序”。

然后,选择要响应的事件,例如按钮的点击事件。

在出现的对话框中,输入事件处理程序的名称,并选择成员变量的名称。

点击“确定”后,Visual Studio会自动生成事件处理程序的代码。

5.控件的常用操作- 设置控件的文本:使用SetWindowText函数,例如SetWindowText("Hello");- 获取控件的文本:使用GetWindowText函数,例如CString str; GetWindowText(str);- 启用或禁用控件:使用EnableWindow函数,例如EnableWindow(FALSE)可以禁用控件;- 显示或隐藏控件:使用ShowWindow函数,例如ShowWindow(SW_HIDE)可以隐藏控件;- 设置或获取控件的位置、大小:使用SetWindowPos和GetWindowRect函数,例如SetWindowPos(NULL, x, y, width, height)可以设置控件的位置和大小;- 样式和外观设置:使用ModifyStyle和SetWindowLong函数,例如在按钮上设置图标和文字风格。

MFC单文档实现多视图

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:现在已经创建了视图,并且都和文档关联起来了。

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

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView在文档类中只要使用(多文档的,单文档的更简单一点儿) POSITION pos=this->GetFirstViewPosition();//要写在文档类中,在其他类中把this换成文档指针就可以了while(pos){CView *pView=this->GetNextView(pos);}而在框架类中只要选取得文档对象,然后再使用上面的代码以下是从一个对象得到另一个对象有方面(摘自MFC深入浅出)从一个对象得到另一个对象的方法本对象要得到的对象使用的成员函数CDocument对象视列表GetFirstViewPosition,GetNextView文档模板GetDocTemplateCView 对象文档对象GetDocument边框窗口GetParentFrameCMDIChildWnd或CFrameWnd 对象活动视GetActiveView活动视的文档GetActiveDocument CMDIFrameWnd对象活动文档边框窗口MDIGetActive在框架类中使用GetActiveView();在文档类中(CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();MFC中怎么在CMainFrame下获得View类的指针使用GetActiveView()函数MFC中普通类如何获取view类的指针?在普通类(Generic class)中怎么得到view类的指针?我试过这样: CMainFrame *p=(CMainFrame*)AfxGetMainWnd();CView *pv=p->GetActiveView();按照你的用法应该就是可以的!是不是在这样用时,View还没有创建完成啊,所以pv才是空的。

CMainFrame *m_pfm = (CMainFrame*)AfxGetApp()->m_pMainWnd;...*m_pView = (...*)m_pfm->GetActiveView();少一句:AfxGetApp()CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;CView *pv = (CView*)p->GetActiveView();楼上的分析在理,楼主理一下函数调用顺序, 别是什么PreCreateWindow或是CXXXApp,CXXXFrame的构造函数,InitInstance 里,模板主窗口都没建完就准备操纵这个CView了asdfasdf怎样在MFC中返回类的指针,比如cwin,view类等等!在CView类中,调用this->GetDocument()得到doc。

在CDocument类中,调用GetFirstViewPosition()和GetNextView()得到所有的view。

在其它类中,一种方法先是把指针传进去,以备调用的时候使用。

另外就要用AfxGetApp()得到CWinApp,然后再用GetFirstDocTemplatePosition()和GetNextDocTemplate()得到doc template,然后调用GetFirstDocPosition()和GetNextDoc()得到doc。

如何在OnDraw函数或***Dlg函数中获得View类的指针(this)或整个对话框的指针?在单文档中你可以采用如下方法:现在要获得指针的文件开始处包含两个文件:视图的主框架类头文件,即#include "MainFrm.h"视图类头文件,即#include "XXView.h"然后在要访问m_pSet处添加如下语句CMainFrame* frm=(CMainFrame*)AfxGetApp()->m_pMainWnd; CXXView* pView=(CXXView*)frm->GetActiveView();pView即View类指针不过你用this不是更简单吗?mfc的单文档中从一个视图的treeview类中获取Ctestview产生的视图窗口句柄?获取单文档框架中的那个视图的窗口句柄。

求一段代码。

网上查了一下,没弄出来。

哪位兄弟有时间写一段。

你说的不明不白的。

方法可谓多矣。

可以通过全局对象theApp获得视图指针,然后视图指针->GetSafeHwnd();获得句柄。

还可以发送自定义消息把句柄发送到指定窗口类。

还可以在你的stdafx.h中定义一个Cview指针,在程序初始化过程使之指向View类,在你的treeview中使用。

还可以自己为treeview类定义方法接收句柄,在调用的时候传入。

注意处理好创建顺序问题,否则debug下会出断言错误。

方法真的很多。

如果你没有用到文档/视图结构,单文档是在创框架窗口中创建的。

有一个变量m_wndView。

这个就是那个句柄了。

他是CWnd派生的。

如果你用到了文档/视图结构,直接GetActiveView就可以。

还有一种情况,如果你用了切分窗口。

忘了哪个函数了。

Get***Pane好像。

查一下便知。

mfc单文档Ctestview产生的视图窗口初始标题如何获取?你可以在资源文件里修改字符窜,具体怎么修改上网查,另外一个方法是在view类的PreCreateWindow函数里return之前加入m_strTitle = "单文档标题";启动了另一个线程CMyApp,如何在CMyApp中访问我的View类呢?如果我是重新生成了一个WinApp类,并且调用AfxBeginThread((RUNTIME_CLASS)CMyApp)启动了另一个线程,那么我又如何在CMyApp中访问我的View类呢?这个问题我早上就问了,可是没有人给我答案。

有哪位高手能赐教啊1。

你可以把该View的类作为参数传入进去,这是最简单的解决方法2。

你可以用如下方法得到CWinApp * pA=AfxGetApp();POSITION pos=pA->GetFirstDocTemplatePosition(); CDocTemplate * pDT=pA->GetNextDocTemplate(pos);pos=pDT->GetFirstDocPosition();CDocument * pD=pDT->GetNextDoc(pos);pos=pD->GetFirstViewPosition();CView * pV=pD->GetNextView(pos);当然,原理是这样,如果你有多个View,或者有Doc,甚至有多个DocTemplate,可以适当调整源代码我试过了,应该没什么问题了吧mfc单文档中如何获取View视图(CmyView类实例产生的窗口)窗口的句柄?在另一个视图类中通过App类来获取.头文件定义:CmyView *GetmyView();实现:CmyView *CmyApp::GetmyView(){if(m_pDocManager){POSITION pos1 = m_pDocManager->GetFirstDocTemplatePosition(); while (pos1){CDocTemplate *pDocTemplate =m_pDocManager->GetNextDocTemplate(pos1);if(pDocTemplate){POSITION pos2 = pDocTemplate->GetFirstDocPosition();while (pos2){CDocument *pDoc = pDocTemplate->GetNextDoc(pos2);if(pDoc){POSITION pos3 = pDoc->GetFirstViewPosition();while (pos3){CView *pView = pDoc->GetNextView(pos3);if(pView){if(pView->IsKindOf(RUNTIME_CLASS(CmyView)))return (CmyView*)pView;}}}}}}}return NULL;}补充一点,如果你是用静态分割产生的分割视图,可以充分利用CSplitterWnd的GetPane函数,比如,在CmylView中去获取CmyView 的窗口句柄(假设CmyView在分割的0行0列):CSplitterWnd *ps = (CSplitterWnd *)GetParent();CmyView *pView = (CmyView *)(ps->GetPane(0,0));pView - >m_hWnd即可获得该视图窗体的句柄简单的很:因为你的view类不止一个,只有当你的view类活动时获取View视图(CmyView类实例产生的窗口)窗口的句柄才有意义!只要一个函数就可以解决。

CView* GetActiveView( ) const;GetActiveView( )获得当前活动view类窗口句柄.。

相关文档
最新文档