MFC如何在文档类或框架类中获得视类指针
MFC 串行化数据和 C++ 对象
使用MFC 串行化数据和C++ 对象作者:JerryZ串行化数据——例子程序:Memo创建一个新的单文档SDI 应用,视图类选择CFormView,以便用户可以在窗口中输入。
在界面中创建三个编辑框,然后再添加三个相应的编辑框变量。
这三个变量是视图类的成员变量,为了交互数据,文档类中也要创建三个对应的变量。
然后,文档类和视图类都要对数据成员进行初始化操作,在文档类中这个工作通常都在OnNewDocument() 函数中进行。
因为下面任何一个操作发生时都触发文档类OnNewDocument()函数执行:∙当用户启动应用程序;∙当用户在“File”菜单中选择“New”选项;视图类的初始化通常由OnIn it ialUpdate() 负责,下面的任何一个操作发生时,代码都会触发视图类OnIn it ialUpdate()函数执行:∙当用户启动应用程序;∙当用户在“File”菜单中选择“New”选项;∙当用户从“File”菜单中选择“Open”选项;在视图类中获得文档类指针的方法是:CFooDoc* pDoc = GerDocument();用此文档指针便可以操作文档类数据:m_ViewData = pDoc->m_DocData;串行化的代码很简单,ar 是一个与用户选择的文件相对应的文档对象(CArch iv e 对象):// CFooDoc 序列化void CFooDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// 将数据写入文件ar << m_DocData;}else{// 从文件中读取数据ar >> m_DocData;}}这样就将数据写入了文件,选择“File”菜单中的“Sav e”或者“Sav e as”即可完成数据的串行化。
如果没有保存数据,退出程序是会提示用户是否保存修改过的数据。
具体细节请参考源代码。
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函数详解MFC(Microsoft Foundation Class)是一种面向对象的Windows应用程序框架,它是微软公司在Windows操作系统下的视窗类库,是Visual C++的一些类和函数的集合。
MFC的作用是提供一种高级的、面向对象的编程结构,让程序员更加容易地开发Windows应用程序。
下面是一些常用的MFC函数及其详解:1. AfxMessageBox函数原型:int AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0);函数作用:显示一个消息框,包含文本、标题和按钮。
参数解释:lpszText:要显示的消息文本。
nType:消息框类型,包括按钮以及图标等样式。
nIDHelp:帮助ID,用于消息框的帮助文件。
返回值:用户选择的按钮行为,如“取消”、“确定”等。
2. AfxGetMainWnd函数原型:CWnd* AfxGetMainWnd( );函数作用:获取当前线程的主窗口对象指针。
参数解释:无。
返回值:当前线程的主窗口对象指针。
3. CString.Format函数原型:int Format(LPCTSTR lpszFormat, ...);函数作用:根据格式控制符格式化字符串。
参数解释:lpszFormat:格式化字符串,格式控制符用“%”标识。
...:格式控制符中各个参数的值。
返回值:格式化后的字符串长度。
4. CListBox.SetCurSel函数原型:int SetCurSel(int nIndex);函数作用:设置列表框中当前选定项的索引。
参数解释:nIndex:要选定项的索引,从0开始。
返回值:如果设置成功,则返回新选定项的索引;否则,返回LB_ERR。
5. CEdit.SetWindowText函数原型:void SetWindowText(LPCTSTR lpszString); 函数作用:设置编辑框的文本内容。
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多文档多视图编程
深入了解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(Microsoft Foundation Class)是微软公司提供的用于开发Windows应用程序的类库。
在MFC中,控件句柄和指针是两个非常重要的概念。
首先,让我们来谈谈控件句柄。
控件句柄通常是指控件在Windows操作系统中的唯一标识符。
在MFC中,可以使用类似CWnd::GetSafeHwnd()这样的函数来获得控件的句柄。
控件句柄可以用于与Windows API进行交互,例如改变控件的外观、位置、大小等。
控件句柄在MFC编程中经常被使用,特别是在需要与底层Windows系统进行交互的情况下。
其次,让我们来讨论控件指针。
在MFC中,控件指针通常是指向控件对象的指针,可以通过这个指针来访问和操作控件对象的属性和方法。
在MFC中,控件指针通常是通过类似GetDlgItem()这样的函数来获取的。
通过控件指针,可以对控件进行各种操作,比如设置控件的文本、使控件可见、禁用控件等等。
控件句柄和指针在MFC编程中扮演着不同的角色,但它们通常是相辅相成的。
控件句柄用于与底层的Windows系统进行交互,而
控件指针则用于在程序中对控件进行操作和管理。
在实际的MFC应用程序开发中,程序员通常需要灵活运用这两个概念,以实现对控件的有效管理和操作。
总之,控件句柄和指针是MFC编程中非常重要的概念,了解它们的含义和用法对于进行MFC应用程序的开发是至关重要的。
希望这个回答能够帮助你更好地理解控件句柄和指针在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将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
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文档与视图深入详解
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应用程序框架中各类之间的访问方法MFC(Microsoft Foundation Classes)应用程序框架是一个基于面向对象的编程框架,用于开发Windows平台的应用程序。
在MFC应用程序框架中,各个类之间的访问是通过成员函数、指针、引用和消息机制等方式进行的。
下面将详细介绍MFC应用程序框架中各类之间的访问方法。
1.成员函数访问:MFC中的类可以通过调用成员函数来访问其他类的成员变量和函数。
通过类的成员函数可以直接访问该类的私有成员,也可以通过公有成员函数访问其他类的公有成员。
例如,在MFC应用程序中,一个对话框类可以通过调用其他类的成员函数来改变其他类的状态或获取其他类的数据。
2.指针访问:在MFC应用程序框架中,可以通过指针访问其他类的成员变量和函数。
通过在一个类中定义一个指向另一个类的指针,可以通过该指针来访问其他类的成员。
指针访问方式常用于实现类之间的数据传递或共享。
例如,在MFC应用程序中,可以定义一个指向对话框类的指针,然后通过该指针来访问对话框类的成员。
3.引用访问:类引用是与指针相关的概念,它允许通过引用来访问其他类的成员变量和函数。
引用访问方式与指针类似,但语法更加简洁。
通过引用可以实现对其他类的成员变量和函数的访问和操作。
例如,在MFC应用程序中,可以定义一个引用类型的成员变量,然后通过该引用来访问其他类的成员。
4.消息机制访问:在MFC应用程序中,类之间的通信主要通过消息机制进行。
消息机制是一种事件驱动的编程模型,用于实现类之间的松耦合。
通过发送消息和处理消息的方式,可以实现对其他类的访问和交互。
例如,在MFC应用程序中,可以通过发送消息给对话框类,然后由对话框类响应并处理消息来实现类之间的通信。
总之,在MFC应用程序框架中,类之间的访问主要通过成员函数、指针、引用和消息机制等方式进行。
具体的访问方法应根据具体的应用场景和需求来选择和使用。
无论采用何种访问方法,都需要注意类之间的依赖关系和耦合度,以确保程序的可维护性和扩展性。
MFC中实现多文档
MFC中实现多文档MFC(Microsoft Foundation Class)是用于Microsoft Windows操作系统的应用程序框架。
多文档是指在一个应用程序中同时打开和管理多个文档的能力。
下面是如何在MFC中实现多文档的步骤:1.创建一个新的MFC应用程序项目:- 在Visual Studio中选择“文件”>“新建”>“项目”。
- 在“左侧导航栏”中选择“Visual C++”>“MFC”。
-选择“MFC应用程序”并点击“下一步”。
-输入项目名称,并选择存储位置,然后点击“下一步”。
-选择“多文档”应用程序类型,并确保“使用多文档视图”选中,然后点击“完成”。
2.修改文档类:- 打开“xxxDoc.h”文件(xxx为你的应用程序名称)。
-在文档类声明中添加一个成员变量来保存文档的数据。
3.修改视图类:- 打开“xxxView.h”文件。
-在视图类声明中添加用户界面控件(如按钮、菜单等)来实现文档的交互操作。
-在视图类声明中,添加成员变量来保存文档数据的指针。
- 在视图类的实现文件中,重写OnInitialUpdate(函数,初始化视图。
4.修改主框架窗口类:- 打开“MainFrm.h”文件。
-在主框架窗口类声明中,添加成员变量来保存文档视图的指针。
- 在主框架窗口类的实现文件中,重写OnCreateClient(函数,创建并管理多个文档视图的布局。
5.添加命令处理函数:- 打开“xxxView.cpp”文件。
-在视图类的实现文件中,添加命令处理函数,例如保存文档、打开新文档等。
6.调试和测试:-编译并运行应用程序。
-打开多个文档,观察每个文档的窗口布局和视图。
-测试各种文档操作,如保存、打开、关闭等。
以上是使用MFC框架实现多文档的基本步骤。
根据你的具体需求,你可以进一步定制和扩展多文档功能,例如添加更多自定义的菜单和工具栏选项、实现文档之间的数据交互等。
mfc框架的基本运行原理
MFC框架的基本运行原理一、概述MFC(Microsoft Foundation Classes)是微软公司开发的基于C++的框架库,用于开发Windows应用程序。
MFC框架的基本运行原理是通过提供一系列的类和函数,封装了Windows操作系统的API,使开发者能够更加方便地创建、管理和操作Windows应用程序的各种界面元素。
二、MFC框架结构MFC框架的结构可以分为以下几个主要部分:1. 应用程序类MFC应用程序类(CWinApp)是MFC框架的入口点,一个MFC应用程序只能有一个应用程序类的实例。
应用程序类负责初始化MFC框架,创建主窗口,处理消息循环等。
2. 窗口类MFC窗口类(CWnd)是应用程序中各个窗口的基类,包括主窗口、对话框等。
窗口类负责创建和管理窗口对象,并处理窗口消息。
3. 控件类MFC控件类(CButton、CEdit、CListCtrl等)是MFC框架提供的一系列封装了Windows操作系统控件的类。
通过使用控件类,开发者可以快速创建和使用各种常见的窗口控件。
4. 文档视图模型类MFC文档视图模型类(CDocument、CView)是MFC框架中用于实现文档视图模型的基类。
文档类负责处理文件的读写和数据的保存,视图类负责显示数据并响应用户输入。
三、MFC消息循环MFC框架是事件驱动的,通过消息循环来处理用户输入和系统消息。
消息循环是一个无限循环,等待用户输入和系统消息的到来,然后将消息分发给相应的窗口进行处理。
消息循环的基本流程如下:1.调用消息循环函数,如AfxWinMain。
2.接收并分发消息,包括用户输入和系统消息。
3.若消息为退出消息,则退出消息循环;否则,将消息发送给相应的窗口进行处理。
4.窗口处理消息,并根据消息类型执行相应的操作。
MFC框架通过封装Windows操作系统的消息机制,使开发者能够以面向对象的方式处理消息,并将消息与具体的窗口对象关联起来。
四、MFC的事件处理机制MFC框架提供了一种基于消息映射的事件处理机制,通过事件处理函数来响应用户输入和系统消息。
MFC控件使用详细教程
使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。
在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。
所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。
Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。
表6.1 Windows标准控件续表6.1前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。
Windows标准控件在以下环境下提供:•Windows 95•Windows NT 3.51及以后版本•Win32s 1.3•注意:•Visual C++ 4.2及以后版本不再支持Win32s。
(2) ActiveX控件ActiveX控件可用于对话框中,也可用于HTML文档中。
这种控件过去被称为OLE 控件。
本书将在专门的章节中来讲述关于ActiveX控件的知识。
这里仅指出ActiveX控件使用了与标准控件完全不同的接口和实现方法。
(3) 其它MFC控件类除了Windows标准控件和自己编写的或者来自于第三方软件开发商的ActiveX 控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装:•类CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。
•类CCheckListBox用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是否被选中。
•类CDragListBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。
在本章我们仅讲述第一类控件,即Windows标准控件。
所涉及的内容包括各个控件的使用及相应的技巧。
MFC MDI
目录MFC中MDI消息处理流程 (1)MFC MDI的几个难点 (2)1)在View中获得Doc指针 (2)2)在App中获得MainFrame指针 (2)3)在View中获得MainFrame指针 (2)4)获得View(已建立)指针 (2)5)获得当前文档指针 (2)6)获得状态栏与工具栏指针 (2)7)框架中加入工具栏和状态栏 (3)8)在Mainframe获得菜单指针 (3)9)在任何类中获得应用程序类 (3)10)从文档类取得视图类的指针 (3)11)单文档中也可以加入多个文档模板 (5)12)一个文档模板可以有多个文档 (5)13)文档中获得指向该文档模板的指针 (5)14)一个文档可以有多个视图 (6)15)从一个视图类取得另一视图类的指针 (6)MFC中MDI消息处理流程在MFC中,消息是通过一个向上递交的方式进行处理,例如一个WM_COMMAND消息的处理流程可能为:1) MDI主窗口(CMDIFrameWnd)收到命令消息WM_COMMAND,其ID为ID_XXX;2) MDI主窗口将消息传给当前活动的MDI子窗口(CMDIChildWnd);3) MDI子窗口给自己的子窗口(View)一个处理机会,将消息交给View;4) View检查自己Message Map;5) 如果View没有发现处理该消息的程序,则将该消息传给其对应的Document对象;否则View处理,消息流程结束。
6) Document检查自己Message Map,如果没有该消息的处理程序,则将该消息传给其对象的DocumentTemplate处理;否则自己处理,消息流程结束;7) 如果在DocumentTemplate中消息没有得到处理,则将消息返回给View;8) View再传回给MDI子窗口;9) MDI子窗口将该消息传给CwinApp对象,CwinApp为所有无主的消息提供了处理。
总结:MFC提供了消息的处理的链式处理策略,处理消息的请求将沿着预先定义好的路径依次进行处理。
MFC编辑框、静态文本框相关的常用函数
《1》GetDlgItemText(ID ,str)作用:从对话框中获取文本第一个参数为要获取的编辑框(或者静态文本框、单选按钮等可以显示内容的控件)的ID,第二个参数为字符串(Cstring 类型)的变量,获取的文本存储在str中。
《2》SetDlgItemText(ID,str)作用:将字符串显示在控件中第一个参数为要显示的编辑框(或者静态文本框、单选按钮、组合框等可以显示内容的控件)的ID,第二个参数为字符串(Cstring 类型)的变量,显示的文本存储在str中。
如果要显示的变量的类型不是Cstring,则通过Format函数强制转换。
通常还要加一个UpDateData(FALSE)。
《3》UINT nID=GetCheckedRadioButton(IDC1, IDC2);作用:获取单选框的选项的ID第一个参数为该组合框中第一个单选按钮的ID,第二个参数为该组合框中最后一个按钮的ID。
《4》CheckRadioButton(IDC1, IDC2, IDC3);作用:初始化单选按钮第一个参数为该组合框中第一个单选按钮的ID,第二个参数为该组合框中最后一个按钮的ID,第三个参数为为缺省选项的ID。
《5》m_scrollBar.SetScrollRange(0, 500) ;作用:设置水平滚动条的取值范围,m_scrollBar为水平滚动条的控制类型的变量,0为设置最小值,500为设置的最大值。
《6》m_nAmount = m_slider.GetPos() ;作用:获取滑块的当前位置。
《7》m_slider.SetRange(0,1000) ;作用://设置滑块取值范围第一个参数为设置的最小值,第二个参数为设置的最大值。
《8》double Volum = atof(strCtrl);作用:将字符串strCtl转换成浮点型的Volum《9》int Volum = atof(strCtrl);作用:将字符串strCtl转换成整型的Volum《10》MessageBox(str) ;(局部函数)作用:输出字符串str《11》AfxMessageBox(str) ;(全局函数)作用:输出字符串str《12》tempt = m_time2.Format("%H:%m:%S") ;作用:将时间转化成字符型(时、分、秒)m_time2为日历时间选取器的变量,tempt为CString型变量《13》tempt = m_time.Format("%Y-%m-%d") ;//将时间转化成字符型作用:将时间转化成字符型(年、月、日)m_time2为日历时间选取器的变量,tempt为CString型变量《14》m_time = CTime::GetCurrentTime();作用:获取系统当前时间m_time为Ctime类型的变量。
[精华版]MFC中CWnd类及其派生类对话框、消息处理、窗口操作
MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。
CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。
当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。
GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。
被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。
不通过消息循环,直接调用窗口函数处理消息。
窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。
将消息放入消息队列,立即返回。
mfc getitemdata 指针
mfc getitemdata 指针
MFC中的GetItemData函数是用于获取列表控件(List Control)中指定项的附加数据的函数。
它的函数原型如下:
DWORD_PTR GetItemData(int nItem) const;
参数nItem是要获取附加数据的列表项的索引。
该函数返回一个DWORD_PTR类型的指针,指向指定项的附加数据。
附加数据可以是用户自定义的任何类型的数据。
以下是一个示例代码,展示了如何使用GetItemData函数获取列表控件中某一项的附加数据:
```
// 假设m_ListCtrl是一个列表控件对象
// 设置某一项的附加数据
DWORD_PTR dwData = (DWORD_PTR)new CMyData(); // 假设CMyData是一个自定义类型
m_ListCtrl.SetItemData(nItem, dwData);
// 获取某一项的附加数据
CMyData* pData = (CMyData*)m_ListCtrl.GetItemData(nItem);
// 使用附加数据进行操作
if (pData != nullptr) {
// 使用pData指针对CMyData进行操作
}
```
在上述示例中,通过SetItemData函数设置了列表控件的第nItem项的附加数据为一个CMyData对象的指针。
然后使用GetItemData函数获取该项的附加数据,并将其转换为CMyData指针。
最后,可以使用pData指针对附加数据进行操作。
请注意,需要在不再需要附加数据时释放相关的资源,以避免内存泄漏。
mfc中的this的用法
MFC中的This的用法一、This指针的定义在MFC中,This指针是一个特殊的指针,它指向当前对象实例。
在类的成员函数中,可以通过"this"关键字访问This指针。
This指针主要用于在类的成员函数中引用当前对象,以便访问对象的属性和方法。
二、This指针的用途1. 访问对象的成员变量:通过This指针,可以在类的成员函数中访问对象的成员变量。
例如,在一个类的成员函数中,可以使用"this->变量名"的形式来访问对象的成员变量。
2. 调用对象的方法:通过This指针,可以在类的成员函数中调用对象的其他方法。
例如,在一个类的成员函数中,可以使用"this->方法名()"的形式来调用对象的其他方法。
3. 判断对象自身:在某些情况下,我们需要在类的成员函数中判断调用该方法的对象是否为当前对象实例。
这时可以使用This指针进行判断。
例如,在MFC中的消息处理函数中,可以使用"this == this"的形式来判断是否是同一对象实例。
三、This指针的使用场景1. 在类的成员函数中使用:在类的成员函数中,可以通过This指针访问当前对象的成员变量和方法。
2. 在回调函数中使用:在某些情况下,我们需要将类的成员函数作为回调函数传递给其他函数或线程。
这时可以使用This指针来访问当前对象实例。
3. 在多重继承中使用:在多重继承中,可以使用This指针来确定调用方法的对象的实际类型。
四、This指针与MFC框架的关系MFC框架是微软提供的一套用于Windows应用程序开发的C++类库,它基于C++编程语言。
在MFC框架中,类的成员函数通常都会使用This指针来引用当前对象实例。
通过使用This指针,MFC框架能够方便地实现面向对象编程的各种特性,如封装、继承和多态等。
同时,MFC框架也充分利用了C++的特性,如动态内存分配和异常处理等,使得Windows 应用程序的开发更加高效和可靠。
【MFC】AfxGetMainWnd()函数使用心得
【MFC】AfxGetMainWnd()函数使用心得关于AfxGetMainWnd()函数的通常认识:1、使用AfxGetMainWnd()函数获取MFC程序中的主框架类指针是一个常用作法。
2、获得应用程序主窗口的指针的方法,AfxGetMainWnd()->m_hWnd或者AfxGetMainWnd()->GetSafeHwnd()。
但是,在用户线程中调用AfxGetMainWnd()函数好像就不灵了,为什么?调试如下程序,按“F11”跟踪进去。
1.inline CEzCadToolDlg * GetDlg()2.{3.return (CEzCadToolDlg *)AfxGetMainWnd();4.}看到该函数是Microsoft这么实现的。
首先得调用AfxGetThread()函数,获取当前线程的句柄,然后调用GetMainWnd()函数。
1._AFXWIN_INLINE CWnd* AFXAPI AfxGetMainWnd()2.{ CWinThread* pThread = AfxGetThread();3.return pThread != NULL ? pThread->GetMainWnd() : NULL; }这么看来,AfxGetMainWnd()函数获取的句柄与所在线程关系紧密。
查阅MSDN,有如下阐述:If AfxGetMainWnd is called from the application's primary thread, it returns the application's main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associatedwith the thread that made the call.如果 AfxGetMainWnd是从应用程序的主线程调用,它根据上述规则将返回应用程序的主窗口。