MFC中CMainFrame類CDoc類CView類CApp類之間關係
用APPWIZARD這個工具聲稱的應用程式架構包括了應用程式基本的四個類,
分別是:CApp,CMainFrame,CDoc,CView。
其中 CApp負責整個應用程式的管理,CDOC類中有一個CAPP的指標,也可以認為應用程式是從CApp開始執行的。
CMainFrame是主視窗框架
CDoc是應用程式資料來源(文件)主要是用來管理資料,提供儲存和載入資料的功能。有關檔案的讀寫操作在CDoc的Serialize函式中進行。
CView是應用程式資料顯示(檢視)主要是用來資料顯示,以及給使用者提供對資料的編輯和修改功能。有關資料或圖形的顯示操作在CView的OnDraw函式中進行。
基本的應用程式就是由這四個類構成的。使用者需要做的就是對這些類例項化,以實現所需要的具體功能。
在SDI(單文件)介面中,選單響應遵循這樣一個順序:選單訊息先由CMainFrame類接收,CMainFrame並不直接在內部尋找對應的相應函式,而是到CView類尋找。如果CView類有該訊息的響應函式,那麼就直接呼叫CView類中的響應函式,否則,轉到CDoc類尋找,如果CDoc類中存在該訊息的響應函式,那麼就直接呼叫CDoc類中的響應函式,否則,返回到CMainFrame類尋找。如果CMainFrame類中也沒有,返回到CApp類中尋找。如果在CApp類中也沒有找到,表示沒有該選單的響應函式。
可以這樣來理解,選單訊息響應函式的順序是:CView>CDoc>CMainFrame
框架、文件、檢視類之間的呼叫關係
1、主框架(CFrameWnd)中訪問檢視(CView)
CView* GetActiveView() const;
通常定義的檢視為CView的派生類,在呼叫自定義檢視物件的方法時
應該這樣寫:((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, // 要更新的檢視指標,如果希望更新所有視
圖,將此引數設為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;
}