在MFC中M$引入了文檔-視結構的概念,文檔相當於數據容器,視相當於查看數據的窗口或是和數據發生交互的窗口。(這一結構在MFC中的OLE,ODBC開發時又得到更多的拓展)因此一個完整的應用一般由四個類組成:CWinApp應用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。(VC6中支持創建不帶文檔-視的應用)
在程序運行時CWinApp將創建一個CFrameWnd框架窗口實例,而框架窗口將創建文檔模板,然後有文檔模板創建文檔實例和視實例,並將兩者關聯。一般來講我們只需對文檔和視進行操作,框架的各種行為已經被MFC安排好了而不需人為干預,這也是M$設計文檔-視結構的本意,讓我們將注意力放在完成任務上而從界面編寫中解放出來。
在應用中一個視對應一個文檔,但一個文檔可以包含多個視。一個應用中只用一個框架窗口,對多文檔界面來講可能有多個MDI子窗口。每一個視都是一個子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口為MDI子窗口。一個多文檔應用中可以包含多個文檔模板,一個模板定義了一個文檔和一個或多個視之間的對應關系。同一個文檔可以屬於多個模板,但一個模板中只允許定義一個文檔。同樣一個視也可以屬於多個文檔模板。(不知道我說清楚沒有)
接下來看看如何在程序中得到各種對象的指針:
全局函數AfxGetApp可以得到CWinApp應用類指針
AfxGetApp()->m_pMainWnd為框架窗口指針
在框架窗口中:CFrameWnd::GetActiveDocument得到當前活動文檔指針
在框架窗口中:CFrameWnd::GetActiveView得到當前活動視指針
在視中:CView::GetDocument得到對應的文檔指針
在文檔中:CDocument::GetFirstViewPosition,CDocument::GetNextView用來遍歷所有和文檔關聯的視。
在文檔中:CDocument::GetDocTemplate得到文檔模板指針
在多文檔界面中:CMDIFrameWnd::MDIGetActive得到當前活動的MDI子窗口
一般來講用戶輸入消息(如菜單選擇,鼠標,鍵盤等)會先發往視,如果視未處理則會發往框架窗口。所以定義消息映射時定義在視中就可以了,如果一個應用同時擁有多個視而當前活動視沒有對消息進行處理則消息會發往框架窗口。