扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:疙瘩 来源:cncsk.com 2007年9月15日
关键字: 软件
3.从一个视图类取得另一视图类的指针
综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。
同样,可以实现成一个函数:
(假设要从CTestAView中取得指向其它视图类的指针)
CView* CTestAView::GetView(CRuntimeClass* pClass)
{ CTestDoc* pDoc=(CTestDoc*)GetDocument();
CView* pView;
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
pView=pDoc->GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;}
return pView;}
这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
4. 从主帧窗口类获得视图类指针
对本文所举的Test这各SDI程序来说,这是简单的,只需用CFrameWnd类的GetActiveView()成员函数即可。格式如下:
CFrameWnd::GetActiveView()
但将此函数应用在MDI应用的CMDIFrameWnd为中时,并不象所想的那样获得当前活动子窗口的视图类,而是返回NULL,这是一个要领性问题。在MDI程序中,CMDIFrameWnd没有和任何视图类发生关系,也就是说没有视图类直接属于它,只有子帧窗口类CMDIChildWnd才是所有子窗口视图类的父窗口。而子帧窗口的父窗口才是CFrameWnd。
因此,在MDI程序中获得活动视图类的正确方法应为:先获得活动子帧窗口,再从活动子帧窗口中获得活动视图类:
//获得活动子帧窗口
CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
//或:CMDIChildWnd* pChild=MDIGetActive();
//获得活动子帧窗口的活动视图
CMyView* pView=(CMyView*)pChild->GetActiveView();
5.从视图类中获得主帧窗口类指针:
用函数:CWnd::GetParentFrame()或AfxGetMainWnd(); 可达到目的。
GetParentFrame()的工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。用法在InfoViewer中有详细介绍。
6.在任何类中获得应用程序类
用MFC全局函数AfxGetApp()可做到。
7.从应用程序类中获得主帧窗口类
CWinThread类有一个数据成员叫m_pMainWnd,由于CWinApp类由CWinThread派生而来,我们的应用程序为又由CWinApp派生而来,所以我们的CTestApp类也有一个m_pMainWnd成员,它所指南的即是CMainFrame类。(需进行合适的强制类型转换)。
总结起来有几点注意:
A.在类A中获得类B的指针时,类A应包含类B的头文件。
B.在很多时候要进行强制类型转换,并要注意括号的括法。
由于派生类和父类指针类型的兼容,使明确区分各个类变得十分重要。在拿不准的时候,最好加上强制类型转换。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者