MFC中的CApp,CMainFrame,CDoc,CView

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。

發佈了10 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章