http://support.microsoft.com/kb/108587/zh-cn
在一个 Microsoft 基础类 (MFC) 在基于 Windows 的应用程序,它通常是能够获取对当前活动文档的指针或查看从任何位置在程序中非常有用。 渚嬪能够从一个对话框中访问当前文档是有时非常有用。 本文讨论了用于执行此操作,使用 MFC 对象和基本 MFC 体系结构之间关系最简单的方法。
可能需要一个指向当前活动视图或文档的情况之一是模式对话框或无模式对话框中。 通常,一个对话框,应创建视图类通过因为该视图是什么处理应用程序的用户界面。
视图类创建对话框中,因为它可以将指针传递给自身,或对话框中将活动文档 [获得与 GetActiveDocument() 函数]。 这可以通过对话框的构造函数或某些其他成员函数来完成。 对于有模式对话框视图可能还数据从对话框到文档时放入 DoModal() 返回。
这些方法都要依赖于泛型函数以返回到当前活动视图或文档的指针通常更可取。
若要允许您获取指向当前处于活动状态的文档从任意位置的指针将在程序中静态成员函数添加到您 CDocument 派生的类,如下所示:
编辑文档的头文件,如下所示,添加静态成员函数 GetDoc():
// Document header file
class CMyDoc : public CDocument
{
...
public:
static CMyDoc * GetDoc();
...
};
标单文档界面 (SDI) 应用程序添加以下代码 SDI 文档的实现文件用于 CMyDoc::GetDoc():
// 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();
...
};
For SDI 应用程序添加以下代码 SDI 视图的实现文件用于 CMyView::GetView():
// 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 版本和 GetView() 函数的 SDI 版本将使用运行时类型检查以验证文档或视图是正确的类。