转自http://blog.youkuaiyun.com/wrnickle/archive/2005/03/16/248177.aspx
MDI对象之间的交互函数
类 函数 返回值
Global AfxGetApp CWinApp *(指向当前程序)
Global AfxGetMainWnd CWnd *(指向程序主窗口框架)
CMDIFrameWnd MDIGetActive CMDIChild Wnd *(指向当前活动的MDI子窗口)
CWnd GetParentFrame CFrameWnd *(指向父窗口框架)
CFrameWnd GetActiveView CView*(指向当前活动视)
CFrameWnd GetActiveDocument CDocument *(指向当前活动文档)
CView GetDocument CDocument* (同该视图类相联系)
CDocument GetFirstViewPosition 同文档相关的视图列表中的第一个视图类位置
CDocument GetNextView 同文档相关的视图列表中的下一个视图类位置
e.g. CMainFrame* mfrm=(CMainFrame *)AfxGetMainWnd();
e.g.:得到当前视图:
CFrameWnd* pMain = (CFrameWnd*) AfxGetMainWnd();
CFrameWnd *pChild = (CFrameWnd *) pMain->GetActiveFrame();
CView* m_pAgentView = (CView *)pChild->GetActiveView();
访问当前活动视图和活动文档
1. 对于SDI程序,主框架窗口就是文档框窗,可以采用以下方法取得当前文档和视图:
取得活动文档:
CMyDocument* pDoc;
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
或
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetMainWnd());
这两者是等效的。
取得活动视图:
CMyView* pView;
pView=(CMyView*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
2. 对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动文档和视图:
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();
取得活动文档:
CMyDocument* pDoc=pChild->GetActiveDocument();
CMyView* pView=(CMyView*)pChild->GetActiveView();
可以把上述函数片段做成静态成员函数,比如:
static CMyDocument::GetCurrentDoc()
{
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()- >m_pMainWnd)->GetActiveFrame();
CMyDocument* pDoc=pChild->GetActiveDocument();
}
这样就可以通过以下方式取得活动文档(或视图):
CMyDocument::GetCurrentDoc();
注:静态成员函数调用时不需要一个具体的对象与之相关联。
文档模板中找文档
例:
CMultiDocTemplate* pDocTmpl;
pDocTmpl = ((CImpApp*)AfxGetApp())->m_pDocTemplate;
POSITION posDoc= pDocTmpl->GetFirstDocPosition();
while(NULL!=posDoc)
{
pFrmDoc = (CFrmDoc*) pDocTmpl->GetNextDoc(posDoc);
nDocOrder++;
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/wrnickle/archive/2005/03/16/248177.aspx