第七章 簡單而完整的MFC骨幹程序。
這一章主要是剖析有AppWizard產生的完整的MFC骨幹程序。
首先要熟記MFC類層次結構,這是理解MFC構建的前提。
MFC層次結構圖:文檔視圖結構是MFC進化爲應用程序框架的靈魂,在MFC中CDocument負責處理數據,它只是個空殼,我們可以重寫Serialze函數,派生符合我們需求的類。與CDocument相輔相成的是CView類,它是負責數據得顯示的類,同時它還負責程序與使用者之間的交互。使用者對數據的修改都需要依賴CView類的響應。
有關文件讀寫的操作是由CDocument中的Serilize虛函數負責的。有關顯示的操作是在CView中的OnDraw虛函數中處理的。當我們派生自己的兩個類CMyDoc和CMyView,只要把所有精力花在CMyDoc::Serialize和CMyView::OnDraw身上就可以了。
先介紹Document Template,在文檔視圖結構中,雖然CView負責顯示,但是它的外圍必須有一個外框窗口作爲舞臺。也可以說Document Template是View窗口的一個容器,數據,數據的顯示,以及容納數據顯示的窗口,它們是一體的。缺一不可。
程序每打開一個文件就應該產生三個對象:
1:CDocument對象。
2:CView對象。
3:外框窗口CMDIChildWnd對象。
這些對象是由Document Template對象進行管理
如:CMultiDocTemplate *pDocTemplate=new CMultiDocTemplate ( IDR_SCRIBTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMyView)
);
AddDocTemplate(pDocTemplate);
如果程序支持不同的文件格式,就需要不同的CMultiDocTemplate 。它的第一個參數,表示此文件類型所使用的資源,如ICON,MENU和字符串資源。字符串資源用以完整描述文件類型。這可以在程序中獲得,通過調用CDocTemplate::GetDocString。
RUNTIME_CLASS是一個宏,返回傳遞來的類中的CRuntimeClass靜態對象。因此,每當使用者打開一份文件,Document template就能根據此創建三個對象,打開並顯示相應文件。
因此在CMyWinApp的InitInstance中首先new了一個CMultiDocTemplate 對象,它用於管理Document,view和Frame窗口。
LoadFrame用於產生主窗口並加載菜單,同時制定窗口標題、文件標題、擴展名等。LoadFrame內部將調用Create,後者將調用CreateWindowEx,觸發WM_CREATE消息。
一份Document可以映射給多個View顯示,使用者對Document的任何操作都必須通過Document Frame窗口,消息隨後傳到CView。
構建主窗口有兩個步驟,首先new一個CMDIFrameWnd對象,然後調用其LoadFrame函數,在此函數內會調用Create函數