2.18如何得到指向当前活动文档的指针?

      这个问题的解决方案本身并不复杂,但是它要求很好的理解在MFC应用程序中各种对象之间的关系以及操纵那些对象的函数。下面的程序清单显示的技术为此提供了一种获得当前活动文档指针的 类属的、可重用的方法。可以从代码中的任何位置处调用该函数。

CDocument* EkGetActiveDocument() { //1、获得应用程序主框架窗口的指针 CWnd* pWnd=AfxGetMainWnd(); if(pWnd==NULL) return NULL; //2、确保该指针有效,并强制定义了类型 ASSERT_VALID(pWnd); ASSERT_KINDOF(CFrameWnd,pWnd); CFrameWnd* pMainFrame=static_cast<CFrameWnd*>(pWnd); //3、获得获得框架窗口的指针(在SDI应用程序中可能是this) CFrameWnd* pActiveFrame=pMainFrame->GetActiveFrame(); if(pActiveFrame==NULL) return NULL; //4、返回活动文档对象的指针 return pActiveFrame->GetActiveDocument(); } 

上面程序清单中的方案既适用于MDI应用程序,也适用于SDI应用程序。对MDI应用程序而言,GetActiveFrame()函数调用将返回一个指向活动视图的框架窗口(如果不存在,则可能为NULL)的指针。对SDI应用程序而言,GetActiveFrame()函数简单的返回固有的this指针,因为主框架窗口同时起着视图框架窗口的作用。

附加注释:

应该注意到,上面的程序清单显示的函数在某些情况下可能返回一个NULL指针。所以,当你设计代码的时候,应该考虑到这种可能性。还有,返回的指针是类属的CDocument*类型,如果打算根据活动文档对象的某个特定类进行操作,那么必须依赖运行时类型信息机制,该机制由MFC通过CObject类和CRuntimeClass结构提供。下面的程序清单显示了如何检查活动文档对象的这个类 以安全的 把由EkGetActiveDocument()函数返回的CDocument*指针向下映射成强制类型定义的指针。

CDocument* pActiveDoc=EkGetActiveDocument(); if(pActiveDoc!=NULL) { if(pActiveDoc->IsKindOf( RUNTIME_CLASS(CMyDoc1) ) ) { CMyDoc1* pMyDoc1=static_cast<CMyDoc1*>(pActiveDoc); //....使用pMyDoc1.... } else if(pActiveDoc->IsKindOf( RUNTIME_CLASS(CMyDoc2) ) ) { CMyDoc2* pMyDoc2=static_cast<CMyDoc2*>(pActiveDoc); //....使用pMyDoc2.... } else { //... } } 

下面的程序清单工作方式与上面的相同,但是使用了DYNAMIC_DWONCAST()宏代替IsKindOf()和static_cast以安全的向下映射。

CDocument* pActiveDoc=EkGetActiveDocument(); if(pActiveDoc!=NULL) { CMyDoc1* pMyDoc1=DYNAMIC_DWONCAST(CMyDoc1,pActiveDoc); CMyDoc2* pMyDoc2=DYNAMIC_DWONCAST(CMyDoc2,pActiveDoc); if(pMyDoc1!=NULL) { //...使用pMyDoc1... } if(pMyDoc2!=NULL) { //...使用pMyDoc2... } else { //... } } 

 

你可能感兴趣的:(框架,活动,null,Class,文档,mfc)