如何获取当前 CDocument 或 CView,从任何位置

在 Microsoft 基础类 (MFC) 基于 Windows 的应用程序,通常很有用的功能是能够获得到当前处于活动状态的文档的指针或从任意位置的程序中查看。例如,可以从对话框中访问当前文档有时是很有用的。本文讨论的最简单的方法来实现此目的,通过使用 MFC 对象和基本 MFC 体系结构之间的关系。

一种情况下,可能需要一个指向当前活动视图或文档的地方是在模式对话框或无模式对话框中。通常情况下,对话框中应创建的视图类,因为该视图是什么处理应用程序的用户界面。

对话框中创建视图类,因为它可以将指针传递给本身,或活动文档 [使用 GetActiveDocument() 函数获取] 对话框中。这可以通过对话框中的构造函数或某些其他成员函数来完成。模式对话框,视图可能还将数据从对话框中插入文档 DoModal() 返回时。

这些方法都依赖于泛型函数,以返回到当前活动视图或文档的指针通常更可取。

允许您获取当前处于活动状态的文档中任何位置的指针在程序中,添加静态成员函数向 CDocument 派生类,如下所示:

编辑文档的头文件中,如下所示,若要添加一个静态成员函数,GetDoc():

   // Document header file

   class CMyDoc : public CDocument

   {

      ...

      public:

      static CMyDoc * GetDoc();

      ...

   };

                          

单文档界面 (SDI) 应用程序中,用于为 CMyDoc::GetDoc() 添加到 SDI 文档的实现文件的以下代码:

   // SDI document implementation file

   CMyDoc * CMyDoc::GetDoc()

   {

      CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);

      return (CMyDoc *) pFrame->GetActiveDocument();

   }

                          

多文档界面 (MDI) 应用程序的 CMyDoc::GetDoc() 代码应如下:

   CMyDoc * CMyDoc::GetDoc()

   {

      CMDIChildWnd * pChild =

          ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();

 

      if ( !pChild )

          return NULL;

 

      CDocument * pDoc = pChild->GetActiveDocument();

 

      if ( !pDoc )

         return NULL;

 

      // Fail if doc is of wrong kind

      if ( ! pDoc->IsKindOf( RUNTIME_CLASS(CMyDoc) ) )

         return NULL;

 

      return (CMyDoc *) pDoc;

   }

                          

若要使您能够从任意位置当前活动视图的指针在程序中,添加静态成员函数的 CView 派生类,如下所示:

编辑视图的头文件,如下所示,若要添加一个静态成员函数,GetView():

   // View header file

   class CMyView

   {

      ...

      public:

      static CMyView * GetView();

      ...

   };

                          

SDI 应用程序,对于 CMyView::GetView() 添加到 SDI 视图的实现文件的以下代码:

   // View implementation file

   CMyView * CMyView::GetView()

   {

      CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);

 

      CView * pView = pFrame->GetActiveView();

 

      if ( !pView )

         return NULL;

 

      // Fail if view is of wrong kind

      // (this could occur with splitter windows, or additional

      // views on a single document

      if ( ! pView->IsKindOf( RUNTIME_CLASS(CMyView) ) )

         return NULL;

 

      return (CMyView *) pView;

   }

                          

对于 MDI 应用程序中,CMyView::GetView() 代码应如下:

   // MDI view implementation file

   CMyView * CMyView::GetView()

   {

      CMDIChildWnd * pChild =

          ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();

 

      if ( !pChild )

          return NULL;

 

      CView * pView = pChild->GetActiveView();

 

      if ( !pView )

         return NULL;

 

      // Fail if view is of wrong kind

      if ( ! pView->IsKindOf( RUNTIME_CLASS(CMyView) ) )

         return NULL;

 

      return (CMyView *) pView;

   }

                          

现在,从任何位置在程序中,其中已包括的文档或视图的头文件,您可以调用:

   CMyDoc::GetDoc();

                          

-或者-

   CMyView::GetView();

                          

若要分别获得到的当前处于活动状态的文档或视图的指针。如果没有活动文档或视图,这些函数将返回 NULL。

注意一个指向应用程序的 CDocument 或 CView 派生类返回,而不仅仅是一个泛型 CDocument 或 CView 指针。这使您可以访问特定于您的新类的成员。这些函数中,MDI 版本和 SDI 版本的 GetView() 函数中,将使用运行时类型检查,以验证文档或视图是正确的类。

posted @ 2014-05-06 14:40  Alex_CC  阅读(1111)  评论(0)    收藏  举报