1. 程式人生 > >MFC中CMainFrame類CDoc類CView類CApp類之間關係

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

>CApp

框架、文件、檢視類之間的呼叫關係

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;
}