在MFC类中各种类的指针的获取和应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
理一理MFC的这几个类的关系,可以很容易明白上面的这些乱七八糟的逻辑。
App是应用域,所有的域中的东西都可以通过全局函数访问到它。
MainFrame是主框架,也基本可以用全局函数访问到。
MainFrame下是若干个ChildFrame,ChildFrame中若干个View和Document(可能不成对),ChildFrame管理着View,View和Document进行互操作。
因此整体框架就出来了,一般除了直接应用的关系都可以通过MainFrame-->Active ChildFrame-->Active View-->Document这条线进行访问
关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!
一:
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)->GetActiveDocu ment();
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);