在多文檔MFC應(yīng)用程序執(zhí)行過程中,,創(chuàng)建了多于一個的文檔類,、視圖類、子框架類對象和一個主框架類,、應(yīng)用類對象,。這些對象之間是通過一定的方式聯(lián)系在一起的,在應(yīng)用程序設(shè)計中,,時常需要通過這些對象之間的關(guān)系來實現(xiàn)在文檔,、視圖,、框架類對象、應(yīng)用程序類對象間相互引用和調(diào)用,。如下:
1,,視圖類對文檔類的使用
視圖類對象的作用是在客戶區(qū)顯示文檔類對象的內(nèi)容,兩者之間的調(diào)用最為常用,。在視圖類中,通過以下函數(shù)得到文檔類對象的指針,。在視圖類CDrawView中可以找到一個函數(shù):
public:
CDrawDoc* GetDocument();
在視圖類CDrawView的成員函數(shù)中,,可以通過以下代碼調(diào)用GetDocument函數(shù)得到當前文檔類對象指針:
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
得到指向當前文檔類對象的指針pDoc后,同使用普通C++類的指針一樣可以調(diào)用文檔類的成員變量和成員函數(shù)了(只能調(diào)用public型的),。
2,,在框架類中獲得當前的文檔和視圖類對象指針
在主框架類CMainFrame和子框架類CChildFrame中,都可以利用基類的函數(shù),,得到指向當前活動的文檔類和視圖類對象的指針,。下面的代碼可以獲得指向當前活動的文檔類對象和視圖類對象的指針:
CDrawDoc* pDoc = (CDrawDoc*)GetActiveDocument();
CDrawView* pView = (CDrawView*)GetActiveView();
3,獲得應(yīng)用程序類對象的指針
在MFC應(yīng)用程序運行的過程中,,自始自終存在一個應(yīng)用類對象,,可以在MFC派生類或非MFC派生類中,通過全局API函數(shù)AfxGetApp得到應(yīng)用類對象指針,。如可以在應(yīng)用程序Draw中的任何地方,,通過以下代碼獲得指向應(yīng)用程序類對象的指針:
CDrawApp* pWinApp = (CDrawApp*)AfxGetApp();
4,從應(yīng)用程序?qū)ο笾蝎@得主框架類對象的指針
通過MFC應(yīng)用程序的應(yīng)用類對象,,可以獲得指向當前系統(tǒng)的主框架類對象的指針,,在應(yīng)用類CWinApp中有一個數(shù)據(jù)成員m_pMainWnd,這個數(shù)據(jù)成員保存了指向應(yīng)用程序主框架類對象的指針:
CMainFrame* pFrame = (CMainFrame*)(AfxGetApp->m_pMainWnd);
在視圖類,、文檔類,,以及非MFC派生類的成員函數(shù)(如全局函數(shù))中,是通過API函數(shù)AfxGetApp()獲得指向應(yīng)用類對象的,,再調(diào)用以上代碼,,得到指向主框架類對象的指針。
通過API函數(shù)AfxGetApp()得到指向應(yīng)用程序類對象的指針,,再通過應(yīng)用程序類對象得到指向主框架類對象的指針,,通過主框架指針又可以獲得指向當前活動的文檔和視圖類對象的指針。這種調(diào)用可以保證在各種情況下,,獲得指向MFC應(yīng)用程序中各主要框架類對象的指針,,通過指針使用各框架類對象的成員(數(shù)據(jù)或函數(shù))。
========================================================================================================
========================================================================================================
框架,、文檔,、視圖類之間的調(diào)用關(guān)系
1,、主框架(CFrameWnd)中訪問視圖(CView)
CView* GetActiveView() const;
通常定義的視圖為CView的派生類,在調(diào)用自定義視圖對象的方法時
應(yīng)該這樣寫:((CMouseKeyView*)GetActiveView())->MyFunc();
2,、主框架(CFrameWnd)中訪問文檔(CDocument)
GetActiveDocument,,返回CDocument對象;
3,、在視圖(CView)中訪問文檔(CDocument)
inline CMouseKeyDoc* CMouseKeyView::GetDocument()
{return (CMouseKeyDoc*)m_pDocument;}
4,、在視圖(CView)中訪問框架(CFrameWnd)
CFrameWnd* GetParentFrame() const;
5、在文檔(CDocument)中訪問框架(CFrameWnd)
CWnd* AfxGetMainWnd();
CWnd* AfxGetApp()->m_pMainWnd;
6,、在文檔(CDocument)中訪問視圖(CView)
UpdateAllViews
功能:通知所有的視圖文檔已被修改的信息
原型:
void UpdateAllViews(
CView* pSender, // 要更新的視圖指針,,如果希望更新所有視
圖,將此參數(shù)設(shè)為NULL
LPARAM lHint=0L, // 包含更改消息的通知
CObject* pHint=NULL // 保管更改消息的對象
}
7,、在其他類中訪問文檔類(CDocument)
CDocument* GetDocument()
{
CFrameWnd* frm=(CFrameWnd*)::AfxGetMainWnd();
ASSERT(frm);
CDocument* pDoc=frm->GetActiveDocument();
ASSERT(pDoc);
ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc)));
return (CMouseKeyDoc*)pDoc;
}