資源描述:
《vc文檔視圖結構》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、深入分析MFC文檔視圖結構(項目實踐)文檔視圖結構(Document/ViewArchitecture)是MFC的精髓,也是Observer模式的具體實現(xiàn)框架之一,Document/ViewArchitecture通過將數(shù)據(jù)和其表示分開,提供了很好的數(shù)據(jù)層次和表現(xiàn)層次的解耦。然而,雖然我們使用MFCAppWizard就可以很輕松地獲得一個支持Document/ViewArchitecture的MFC程序框架,Document/ViewArchitecture本身的復雜性加上VC產生的一系列代碼足夠讓我們眼花繚亂,一時陷入云里霧里不可自拔。加上我們更多的人都沒有經過Wind
2、owsSDKProgramming的學習和經歷就直接進行MFCProgramming的學習和開發(fā),更是面對一堆的代碼不知所措。之于Document/ViewArchitecture,侯捷先生的《深入淺出MFC》一書確實進行了很深入的分析和研究,網絡上也有很多在侯捷先生著述的基礎上的進一步的文章出現(xiàn),但是個人覺得這里面有一點瑕疵(僅代表k_eckel淺見):太過深入,這些分析和研究都最終會定位到WindowsSDK中窗口的創(chuàng)建過程、MFC中對Document/ViewArchitecture支持所提供的復雜無序的宏等對于沒有WindowsSDKProgramming經驗和經
3、歷的學習者和對于MFC不是很熟悉的學習者無異于是徒增煩惱,一個本來就很復雜的問題更加地復雜化了。我的觀點是這個過程是必要的,然而不是每個人所必需的,或者說不是每個人在初期學習和絕大多數(shù)項目開發(fā)中所必需的。我向來對眾多的僅僅學會了拖拉點拽就以為會了MFC(侯捷先生在《深入淺出MFC》一書中對這個群體有一個照面,這里不羅嗦)不以為然,但是我依然認為輕量級學習成本是重要的,容易上手,易于接受是一門技術成功或者說有價值的一個很大的決定性因素。因此提供一個輕量級的學習過程對于學習來說是很有必要性的,本系列文章就遵循這樣一個理念,對MFC中Document/ViewArchitect
4、ure進行一個分析(姑且也可以稱之為深入),盡量將對Document/ViewArchitecture的理論研究(侯捷先生書中很多內容)和實際的項目開發(fā)結合起來,最后提供一個簡單但是全面的Document/ViewArchitecture項目開發(fā)(主要是界面框架設計和開發(fā))的實際例子,供參考。1必備基礎知識概述1.1MFC文檔視圖結構程序結構總攬當我們使用MFCAppWizard生成一個MFC程序,選用所有默認的設置(當然也是MultipleDocuments,本文討論主要基于MultipleDocuments,對于SingleDocument情況僅以簡單表述提及,皆因后
5、者和前者很多相似相同之處,但前者更為復雜,并且更加常用。),假設你的程序名稱為A,則你會得到CMainFrame、CChildFrame、CAboutDlg、CADoc、CAView、CAApp6個類(SingleDocument僅少一個CChildFrame類,其余均同)。這些類的具體含義將在后面給出,這里先要給出一個MFC支持文檔視圖結構程序(以下簡稱App)的主要組成:u??????一個App(對應類CAApp)可以包含多個文檔模版(CDocTemplate),但是MFCAppWizard(無論是SDI還是MDI)都只是默認生成一個。但是在實際開發(fā)中一個文檔模版不夠
6、,需要自己手工添加(在后面實際項目例子提供示例)。這個結構是通過MFC中CWinApp的成員變量CDocManager*m_pDocManager實現(xiàn)的,我們的CAApp正是繼承自MFC提供的CWinApp類。u??????CDocManager類則擁有一個指針鏈表CPtrListm_templateList來維護這些文檔模版。這些文檔模版都是在CAApp::InitInstance()中通過AddDocTemplate(pDocTemplate)。u??????CDocTemplate擁有3個成員變量,分別保存著Document、View、Frame的CRuntimeC
7、lass指針,另外持有成員變量m_nIDResource,用來指定這個Document顯示時候采用的菜單資源。這4份數(shù)據(jù)都在CAApp::InitInstance()中CDocTemplate的構造函數(shù)中指定。在Document中擁有一個回指CDocTemplate的指針(m_pDocTemplate)。u??????一個文檔可以有多個視圖,由Document中成員變量CPtrListm_ViewList維護。u??????CFrameWnd擁有一個成員變量CView*m_pActiveView指向當前活動的View。u???