一般來說用戶的輸入/輸出基本都是通過視進行,但一些例外的情況下可能需要和框架直接發生作用,而在多視的情況下如何在視之間傳遞數據。
在使用菜單時大家會發現當一個菜單沒有進行映射處理時為禁止狀態,在多視的情況下菜單的狀態和處理映射是和當前活動視相聯系的,這樣MFC可以保證視能正確的接收到各種消息,但有時候也會產生不便。有一個解決辦法就是在框架中對消息進行處理,這樣也可以保證當前文檔可以通過框架得到當前消息。
在用戶進行輸入後如何使視的狀態得到更新?這個問題在一個文檔對應一個視圖時是不存在的,但是現在有一個文檔對應了兩個視圖,當在一個視上進行了輸入時如何保證另一個視也得到通知呢?MFC的做法是利用文檔來處理的,因為文檔管理著當前和它聯系的視,由它來通知各個視是最合適的。讓我們同時看兩個函數:
當文檔的UpdateAllViews被調用時和此文檔相關的所有視的OnUpdate都會被調用,而參數lHint和pHint都會被傳遞。這樣一來發生改變視就可以通知其他的兄弟了。那麼還有一個問題:如何在OnUpdate中知道是那個視圖發生了改變呢,這就可以利用pHint參數,只要調用者將this指針賦值給參數就可以了,當然完全可以利用該參數傳遞更復雜的結構。
視的初始化,當一個文檔被打開或是新建一個文檔時視圖的CView::OnInitialUpdate()會被調用,你可以通過重載該函數對視進行初始化,並在結束前調用父類的OnInitialUpdate,因為這樣可以保證OnUpdate會被調用。
文檔中內容的清除,當文檔被關閉時(比如退出或是新建前上一個文檔清除)void CDocument::DeleteContents ()會被調用,你可以通過重載該函數來進行清理工作。
在單文檔結構中上面兩點尤其重要,因為軟件運行文檔對象和視對象只會被產生並刪除一次。所以應該將上面兩點和C++對象構造和構析分清楚。
最後將一下文檔模板(DocTemplate)的作用,文檔模板分為兩類單文檔模板和多文檔模板,分別由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在於記錄文檔,視,框架之間的對應關系。還有一點就是模板可以記錄應用程序可以打開的文件的類型,當打開文件時會根據文檔模板中的信息選擇正確的文檔和視。模板是一個比較抽想的概念,一般來說是不需要我們直接進行操作的。
當使用者通過視修改了數據時,應該調用GetDocument()->SetModifiedFlag(TRUE)通知文檔數據已經被更新,這樣在關閉文檔時會自動詢問用戶是否保存數據。