獲得窗體控制代碼
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++;
}