CMainFrame是CApp類的主程序窗口(如果是選MDI或SDI結構的話),也就是程序的一個框架。CApp中如無特殊的要求不用加什麼代碼,CMainFrame中也是根據需要,如按照微軟提供的框架也不需要加什麼代碼。
CDocument一般和CView一起使用,這樣的程序叫文檔/視圖結構。CDocument中加的代碼主要是和你的文檔內容有關的,如文檔中信息(對象)等,需要處理的一般有文檔內容的編輯、刪除、添加、序列化(讀寫文件)等方面的代碼。
CView的工作就是把你的CDocument中的內容顯示在文檔上,主要處理的是顯示方面的工作。
AfxGetApp()函數可以得到CApp指針。
CApp->GetMainWnd()函數可以得到CMainFrame指針。
在CDocument或CView中調用的寫法是AfxGetApp()->GetMainWnd()
CMainFrame中可以用GetActiveView()函數得到活動CView的指針。
CView中可以用GetDocument得到CDocument的指針。
假設你是單文檔單個VIEW的程序。那麼:
1)CMainFrame:
GetActiveView()可得到View指針。
GetActiveDocument()可得到Document指針。
2)CDoc:
POSITION pos = GetFirstViewPosition();
CView* pView = GetNextView(pos); //得到View指針
AfxGetMainWnd()可得到MainFrame指針
3) CView:
GetDocument()可得到CDoc指針。
AfxGetMainWnd()可得到MainFrame指針。
-----------------
CWinApp * AfxGetApp()是一個全局函數,在任何地方都可以獲得C***App類對象的指針.
1、//在C***App類中:
獲得CMainFrame類對象的指針: CMainFrame* pMain=(CMainFrame*)CWinThread::m_pMainWnd;
獲得C***View類對象的指針:
(假設只有一個視圖,須通過CMainFrame)
C***View *pView=(C***View *)((CMainFrame*)m_pMainWnd)->CFrameWnd::GetActiveView();
獲得C***Doc類對象的指針(須通過CMainFrame) C***Doc *pDoc=(C***Doc *)((CMainFrame*)m_pMainWnd)->CFrameWnd::GetActiveDocument();
2、 //在CMainFrame類中:
獲得CMainFrame類對象的指針: CMainFrame* pMain=(CMainFrame*)CWnd::GetActiveWindow();
獲得C***View類對象的指針: C***View *pView=(C***View *)CFrameWnd::GetActiveView(); 獲得C***Doc類對象的指針 C***Doc *pDoc=(C***Doc *)CFrameWnd::GetActiveDocument();
3、 //在C***Doc類中:
獲得CMainFrame類對象的指針:
CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd();
CMainFrame* pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;
獲得C***View類對象的指針:
(假設只有一個視圖,須通過CMainFrame)
C***View *pView=(C***View *)((CMainFrame*)AfxGetApp()->m_pMainWnd)->CFrameWnd::GetActiveView():
(假設有兩個以上視圖,以找尋C***View爲例) POSITION pos=CDocument::GetFirstViewPosition();
while(pos != NULL)
{
CView *pView=CDocument::GetNextView(pos);
if(pView->GetRuntimeClass()==RUNTIME_CLASS(C**View))
{ }
}
4、 //在C***View類中:
獲得CMainFrame類對象的指針:
CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd(); CMainFrame* pMain=(CMainFrame*)CWnd::GetParentFrame();
CMainFrame* pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;
獲得C***Doc類對象的指針
C***Doc *pDoc= GetDocument();
注意:
1 在CFrameWnd::ActivateFrame函數之後可以取得CMainFrame *
2 在CView::OnCreate函數執行完畢後,可以查找C***View *
3 在CView::OnCreate函數執行完畢後,可以取得C***Doc *
-------------------------------
MFC程序的來龍去脈:
1.首先是App類的對象.-->AfxWinMain()(編譯器連接的
AfxWinMain()中包括了
-->AfxWinInit()的調用
-->InitApplication()(初始化工作)
-->InitInstance()調用(在CMyWinApp中重載)
-->Run()(進入消息循環)
2.CMainFrame類
MFC靠消息驅動-->而消息首先被Frame窗口接收.-->再進入特定的循環
3.CDocument類
數據分爲:
1.數據體(即數據的處理-->在Doc類中進行)
2.數據的面:(數據的顯示-->在View類中進行)
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。