文件,視,框架之間相互作用
一般來說使用者的輸入/輸出基本都是通過視進行,但一些例外的情況下可能需要和框架直接發生作用,而在多視的情況下如何在視之間傳遞資料。
在使用選單時大家會發現當一個選單沒有進行對映處理時為禁止狀態,在多視的情況下選單的狀態和處理對映是和當前活動視相聯絡的,這樣MFC可以保證視能正確的接收到各種訊息,但有時候也會產生不便。有一個解決辦法就是在框架中對訊息進行處理,這樣也可以保證當前文件可以通過框架得到當前訊息。
在使用者進行輸入後如何使視的狀態得到更新?這個問題在一個文件對應一個檢視時是不存在的,但是現在有一個文件對應了兩個檢視,當在一個視上進行了輸入時如何保證另一個視也得到通知呢?MFC的做法是利用文件來處理的,因為文件管理著當前和它聯絡的視,由它來通知各個視是最合適的。讓我們同時看兩個函式:
void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
void CDocument::UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL )
當文件的UpdateAllViews被呼叫時和此文件相關的所有視的OnUpdate都會被呼叫,而引數lHint和pHint都會被傳遞。這樣一來發生改變視就可以通知其他的兄弟了。那麼還有一個問題:如何在OnUpdate中知道是那個檢視發生了改變呢,這就可以利用pHint引數,只要呼叫者將this指標賦值給引數就可以了,當然完全可以利用該引數傳遞更復雜的結構。
視的初始化 ,當一個文件被開啟或是新建一個文件時檢視的CView::OnInitialUpdate()會被呼叫,你可以通過過載該函式對視進行初始化,並在結束前呼叫父類的OnInitialUpdate,因為這樣可以保證OnUpdate會被呼叫。
文件中內容的清除 ,當文件被關閉時(比如退出或是新建前上一個文件清除)void CDocument::DeleteContents ()會被呼叫,你可以通過過載該函式來進行清理工作。
在單文件結構中上面兩點尤其重要,因為軟體執行文件物件和視物件只會被產生並刪除一次。所以應該將上面兩點和C++物件構造和構析分清楚。
最後將一下文件模板(DocTemplate)的作用,文件模板分為兩類單文件模板和多文件模板,分別由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在於記錄文件,視,框架之間的對應關係。還有一點就是模板可以記錄應用程式可以開啟的檔案的型別,當開啟檔案時會根據文件模板中的資訊選擇正確的文件和視。模板是一個比較抽想的概念,一般來說是不需要我們直接進行操作的。
當使用者通過視修改了資料時,應該呼叫GetDocument()->SetModifiedFlag(TRUE)通知文件資料已經被更新,這樣在關閉文件時會自動詢問使用者是否儲存資料。
喜歡筆者文章並且想學習c/c++程式設計的小夥伴可以關注筆者微信公眾號:C語言程式設計學習基地,也可以加Q群,741818652一起來交流哦,群內有很多學習資料可免費領取的!另外筆者也會在Q群裡面進行視訊教學,大家有興趣的可以來哦!