MFC中 SDI/MDI框架各部分指针获取方式
|
获得CWinApp |
获得CMainFrame |
获得CChildFrame |
获得CDocument |
获得CView |
|
| 在CWinApp中 |
AfxGetMainWnd() m_pMainWnd |
AfxGetMainWnd()->MDIGetActive() AfxGetMainWnd()->GetActiveFrame() |
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument() MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument() |
SDI:AfxGetMainWnd()->GetActiveView() MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView() |
|
| 在CMainFrame中 |
AfxGetApp() theApp |
MDIGetActive() GetActiveFrame() |
SDI:GetActiveView()->GetDocument() MDI:MDIGetActive()->GetActiveView()->GetDocument() |
SDI:GetActiveView() MDI:MDIGetActive()->GetActiveView() |
|
| 在CChildFrame中 |
AfxGetApp() theApp |
GetParentFrame() | GetActiveView()->GetDocument() | GetActiveView() | |
| 在CDocument中 |
AfxGetApp() theApp |
AfxGetMainWnd() |
AfxGetMainWnd()->MDIGetActive() AfxGetMainWnd()->GetActiveFrame() |
POSITION pos = GetFirstViewPosition();GetNextView(pos) | |
| 在CView中 |
AfxGetApp() theApp |
AfxGetMainWnd() | GetParentFrame() | GetDocument() | |
| 在其他类中 |
AfxGetApp() |
AfxGetMainWnd() |
AfxGetMainWnd()->MDIGetActive() AfxGetMainWnd()->GetActiveFrame() |
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument() MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument() |
SDI:AfxGetMainWnd()->GetActiveView() MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView() |
http://hi.baidu.com/blackfox1983/blog/item/2538071b3a4f66d0ad6e7583.html
关于MFC下的文档和视图以及框架之间的访问:
一:
1: 因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).
下面所说的是关于单文档的.
例子: 在CMainFrame框架中如何得到视图类的指针.
可以 先得到框架指针,然后调用 GetActiveView 函数指向当前活动视.
C **View * pView;
pView=(C**View*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
当然这些也许都知道是这么用的,但真正的m_pMainWnd和AfxGetApp()是什么意思也许有的人不明白.
大家也许都知道如何在App中获得MainFrame指针(框架类): CWinApp 中的 m_pMainWnd变量就是CMainFrame的指针.
所以在别的类下也可以先得到m_pMainWnd,就得到了MainFrame的指针. 所以得到视图类的指针,必先 得到CFrameWnd的指针m_pMainWnd,然后在调用FrameWnd下的GetActiveView 就指向当前活动视.
m_pMainWnd的由来:
每一个MFC应用程序都有一个CWinApp派生类的对象。这个对象对应着程序的主线程。而 CWinApp 类中有一个 CWnd * m_pMainWnd 成员变量。这个成员变量记录了应用程序的主窗口。
当你新建一个MFC应用程序的时候,在 InitInstance虚函数里都会出现对 m_pMainWnd 赋值的语句.唯一的例外是单文档界面的MFC应用程序,你无法在 InitInstance 函数里看到这段代码,因为它已经被隐藏在 ProcessShellCommand 这个函数里了。由此你就可以下结论了:只要创建自己的窗口类,就要把这个类的对象赋值给 m_pMainWnd .而这个成员只能在C**APP类中才可以使用,所以怎样使用这个CWinApp类里的CWnd 类型的变量来得到主框架窗口的指针呢??
AfxGetApp函数才可以 , 因为AfxGetApp()得到的是CWinApp类的对象,且AfxGetApp返回值为CWinApp对象指针,就是MFC生成的C**App.cpp中定义的那个对象(对象theApp的指针)。
因为你是在自己创建的项目中得到CWndApp成员函数或者成员变量,所以你必须强制转换为你自己的项目中的类,才能找到成员函数或者变量.
注: 在单文档中,获得视指针的最简单的方法还是
((C**View *)CFrameWnd::GetActiveView())
2: 当然在FrameWnd中也可以得到文档类的指针:
CMyDocument* pDoc;
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
3: 由上面可以知道:在View中怎样获得MainFrame指针
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
注: 从视图类中获得主帧窗口类指针:用函数:CWnd::GetParentFrame()或AfxGetMainWnd()也
可达到目的。GetParentFrame()的工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。
((CMainFrame *)CWnd::GetParentFrame())
或者
((CMainFrame *)AfxGetMainWnd())
二:
当然对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档:
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();
取得活动视图:
CMyView* pView=(CMyView*)pChild->GetActiveView();
取得活动文档:
CMyDocument* pDoc=pChild->GetActiveDocument();
注: 也可以用这种方法来得到多文档中的视指针
//获得活动子框架窗口
CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
//或:
CMDIChildWnd* pChild=MDIGetActive();
//获得活动子帧窗口的活动视图
CMyView* pView=(CMyView*)pChild->GetActiveView();
三:
1. 从视图类获得文档类的指针
在视图类中需要引用文档类的地方之前,使用以下语句:
C*Doc *pDoc=(C*Doc*)GetDocument();
以后便可使用pDoc指针访问文档类。
2. 从文档类取得视图类的指针 CDocument类提供了两个函数用于视图类的定位:
GetFirstViewPosition()和GetNextView()
注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于
返 回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用 调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到 CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
C*View* pView;
POSITION pos=GetFirstViewPosition();
pView=GetNextView(pos);
这样,便可到了C*View类的指针pView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的 POSITION.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所 有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查.
如:
pView->IsKindOf(RUNTIME_CLASS(C*View));
即可检查pView所指是否是C*View类。
有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:
CView* C*Doc::GetVieww(CRuntimeClass* pClass)
{ CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL){
pView=GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;}
return pView;}
其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
1.pos为NULL,即已经不存在下一个视图类供操作;
2.pView已符合要求。
3.1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。
来源:http://blog.csdn.net/u011478505/article/details/11867347
MFC中 SDI/MDI框架各部分指针获取方式的更多相关文章
- MFC框架各部分指针获取方式
MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...
- (转)MFC中Doc,View,MainFrmae,App各指针的互相获取
App是应用域,所有的域中的东西都可以通过全局函数访问到它. MainFrame是主框架,也基本可以用全局函数访问到. MainFrame下是若干个ChildFrame,ChildFrame中若干个V ...
- MFC中SDI程序创建流程的回顾
SDI程序创建流程的回顾 从CWinApp.InitialInstance()开始, 1.首先应用程序对象创建文档模板; CSingleDocTemplate* pDocTemplate; pDocT ...
- Unity中内置Shader源码的获取方式
现在可以直接在Unity下载页面获得 http://unity3d.com/get-unity/download/archive 包括StandardShader,StandardShaderGUI. ...
- (转)MFC中获得各个类的指针/句柄 ID的总结
http://www.cnblogs.com/ylhome/archive/2009/10/06/1578478.html 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard ...
- MFC中获取各个窗口之间的句柄或者指针对象的方法
MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决. HWND hWnd=::FindWindow(NULL,_T("S ...
- OpenGL在MFC中的使用总结(一)——基本框架
项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,并且是在MFC中的ActiveX中使用.再并且鉴于他们程序主框架的设定.常规的方法还不一定能实现.所以还是查过不少资料,在此一一总结 ...
- MFC中获取App,MainFrame,Doc和View类等指针的方法
From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03 MFC中获取App,MainFrame,Doc和View类等指针的方法 ...
- [转]深入理解MFC中程序框架
最近抽空复习了一下MFC的内容,觉得一篇博文写的不错. 原文内容太多直接给出链接吧:深入理解MFC中程序框架 链接2:深入浅出话VC++(2)——MFC的本质 链接3:MFC单文档/视图结构穷追猛打
随机推荐
- centos开机启动项设置命令:chkconfig
在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后系统默认不会自动启动的.就算手动执行/etc/init.d/mysqld start ...
- 踩坑 PHP Fatal Error Failed opening required File
使用 require 引用文件时,报错如下: require 'https://dev.ryan.com/test.php'; [Sat Mar 19 23:10:50 2011] [warn] mo ...
- imx6移植librtmp
一.openssl交叉编译 1.下载 https://www.openssl.org/source/ 版本不要太高,刚开始版本高了,有些函数取消了,链接不上 使用1.0.1f即可 2.编译成共享库 . ...
- ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Incompatible namespaceIDs
用三台centos操作系统的机器搭建了一个hadoop的分布式集群.启动服务后失败,查看datanode的日志,提示错误:ERROR org.apache.hadoop.hdfs.server.dat ...
- easyui datagrid 学习 (一)
注意:当使用谷歌浏览器时!需要 设置style="overflow:hidden",这样则可以去掉滚动条!(该样式添加到layout上!) fit:属性 自动填父容器, borde ...
- Python机器学习数据挖掘工具sklearn安装和使用
python借助pip安装第三方库,所以首先确保电脑上已成功安装了pip. 安装sklearn前需要先安装numpy.scipy和pandas等库.安装的方式有两种: 一.前往python的组件库页( ...
- 【转】DontDestroyOnLoad(Unity3D开发之五)
原文 http://blog.csdn.net/cocos2der/article/details/38320773 主题 Unity3D Unity中我们从A场景切换到B场景的时候,A场景所有对象 ...
- 【bzoj4810】[Ynoi2017]由乃的玉米田 莫队算法+STL-bitset
题目描述 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n ...
- [luogu3768] 简单的数学题 [杜教筛]
题面: 传送门 实际上就是求: 思路: 看到gcd就先反演一下,过程大概是这样: 明显的一步反演 这里设,S(x)等于1到x的和 然后把枚举d再枚举T变成先枚举T再枚举其约数d,变形: 后面其中两项展 ...
- [51nod 1022] 石子归并v2 [dp+四边形不等式优化]
题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...