以面到點的學習MFC

市面上講解學習MFC的書籍不勝其多,但是閱讀的同學呢,看了一些內容以後,就無法閱讀下去了,覺得MFC好難,有的呢,就會直接去看別人寫的程序,不管是大或小,有時候也能明白一點點,但是總是走不出自己開發設計的第一步,不知道如何實現自己的思想。我本身自己也一開始閱讀了一些如何學習MFC的書籍和視頻教程,但是總歸起來,效果並不明顯,也可以說我的口頭禪“殘廢”。我分析了一下,在這裏我談談我的看法。

我們大家都知道,mfc是一個從win32 sdk上抽象出來的一個層,引入了類和對象的概念。用面向對像的思想管理win32代碼。原來的win32api和機制就是基本的元素,用來構成了MFC這個框架。既然是框架,那麼它已經爲我們寫好了很多默認的程序行爲,當我們用mfc嚮導生成一個基本程序框架的時候,裏面有一些類,還有很多初始化代碼。首先這樣一些代碼就看得頭痛,對於剛剛接觸的人來說就會出現以下問題,不知道爲何這些代碼會出現在這個地方,它起了什麼作用,我放到別的地方可以不可以,我改變他們的執行順序可不可以,有些由框架生成的東西,我不需要,如何纔可以不讓它初始化,有些元素我需要自定義,如程序圖標,我如何纔可以,在哪裏修改等等一系列的問題。也許你通過在某本書上講過了,那麼你學習到了,你就會了,但是這只是一個點,舉個例子,你想修改程序的圖標,在你完全不知道如何去修改的情況下,你參考了一本書,它剛好講述瞭如何修改程序圖標的問題,那麼你看了,你學習到了。但是如果現在要你修改默認的菜單選項,你可能又不會了,你可能又想到去書上找一個可以修改菜單的文章了。其實這樣是一種以“點”爲主的學習方法,這樣的學習方法,其實是很死板的,爲什麼這麼多呢,因爲你可能學習瞭如何修改程序圖標,那麼你可能只會像你看的那本書上講的那樣去修改,那麼你想過沒有,還沒有別的修改方法,我添加別的資源和代碼的時候,我還是用這樣的方法修改,會不會有什麼異常發生呢。如果你這樣學習,當然是不知道的。你這樣的學習方法,猶如高考的同學再打題海戰術,累死不討好的工作,那麼我們不熟學習方法,靈活的使用方法,舉一反三的方法。

前面我說過很多講MFC的書,都犯了大致相同的一個問題,那麼它們的講解是從某個點開始的,如,CObject類,它是所有類的基類,那麼很多書會從它開始,對它的功能以及相關的宏進行詳細的講解。接着又講app類,wnd類,等等,講到每個類的時候,都會詳細的講解它的常用成員函數和數據什麼的,這樣其實學到的都是一個一個離散的(分散的)點,點與點的關係,根本不清楚,越到後來,學習到的東西由於無法聯繫起來,在我們的腦海了非常混亂,而且,說實話,有關類及相關資源的講解,其實在msdn有更加詳細的講解,我們不必如此一一的,就像小學生學習漢字一樣,都完全學習。這裏我就舉一例子,在小學我們是學習基本的漢字,學習如何使用字典,基本的句子結構等等,這個過程很像我們學習c及c++語言,在我們學習c和c++語言的時候,我們學習了基本的語法及基本輸入輸出語句。到了中學的時候,大學的時候,還有誰會天天背某個字的讀音和寫法,然後叫你聽寫的,沒有了吧,而且用小學學的的基本方法,學習表達能力,如果有不認識的字,我們可以查字典嘛。編程也是這樣,如果你掌握了方法,那麼就是一個能力提升的過程,什麼能力呢,就是你的程序設計能力和編寫能力,這時候你所關注的就是編寫一個什麼樣的程序,如何編寫的問題,而不是某個函數什麼意思,某個類怎麼用,這些在msdn中有詳細的介紹,不需要我們都學習,而是我們需要的時候,查詢msdn。就可以了。

下面我說說今天我要說的主題,就是由面到點的學習,從一個面出發,而不再是一個個單獨的知識點。也可以說是先整體後局部的學習方法,例如,我們開始接觸到MFC,那麼我們不用去管單個類或是方法如何使用,而是從整體,去把握它的實現原理,從哪裏開始執行,先後它執行了那些語句,類對象的構造順序,每個初始化函數中所做的工作等等,也就是從原理上去學習,至於具體一個類的對象如何使用,某個函數的參數又是什麼意思等等,這樣的細節我們先不用去管。但是 這個時候又有一個問題,mfc很多工作都是在底層完成,我們無法查看或是即使可以查看,由於其複雜的邏輯關係,我們也理不清到底是個什麼情況。那麼我們應該如何去知道它底層的運行,以及這些運行的順序和職能等等。舉個例子,比如我們用mfc嚮導生成一個單文檔程序的框架,一出來,默認情況下就有5個類,分別是app類,mainframe類,document類,view類,還有一個可選的about類。那麼這些類的相互關係是什麼,從哪兒開始,我要添加一個功能到程序中,應該在哪個類的哪個函數中添加等等的問題。這樣的問題,應該說是困擾着大家的,大部分使用者呢,估計就是隻能使用view類,因爲它代表了這個窗口的客戶區,可以在這個客戶區裏面繪製文本或圖像等等操作,而額外的幾個類,就知道的很少,如果我要再添加一個類型應該如何做,在什麼地方添加,mfc會如何對待他等等,估計很多都不知道,所以,如果是這樣情況,根本說無法做到隨心所欲的設計程序。因爲你不知道它的底層到底發生了什麼事情。那麼接下來我做一個假設,假設你明白5個類之間的關係及其中的原理,那麼現在我要改變菜單上默認的“打開”命令,我們知道默認的打開命令是執行的CWinapp類OnFileOpen操作的,那麼現在我要實現自定義的打開命令,當我點擊一個打開命令的時候,我要顯示一個自己的打開對話框,那麼首先我們就要刪掉映射到CWinapp類的打開命令映射項目,然後添加自己的映射項目映射到我們繼承的app類的打開命令處理函數中,那麼剩下的就是在這個命令函數中寫代碼實現打開這個命令,當然是要顯示一個打開對話框,要實現這個打開對話框,其實就相當於一個點,我們從一個面找到了如何實現自己的設想,尋找到我們的實現點,要實現這個點,其實就很簡單了,只用查詢msdn,例如,通過查GetOpenFIleName,IFileDialog,CFileDialog等等,都可以實現,甚至在msdn中你直接就可以找到已經寫好的代碼,你直接複製,稍微做一點修改,如修改要打開的文件類型的擴展名,是多選還是單選等等,就可以滿足你的要求,這樣,你就完成了你要完成的想改變默認打開命令的要求。

上面只是舉了一個簡單的例子,還留了一個問題,就是底層很複雜的代碼,如果要我去看底層的代碼來知道mfc到底爲了做了什麼,怎麼做的,是相當的困難的。那麼我們就可以在msdn中找到這一切,如下圖:


這個圖來自msdn在講解mfc文檔視圖框架的時候中的一個圖,爲我們闡述了內部各個類之間的關係,相互的構造順序等等。如此,我們就可以層層深入,例如,我們再看到doucment類的時候,我們就會接觸到串行化,然後就會講到CObject這個類,通過這種方法,你在不知不覺中已經就學會了CObject,而不像書本中,一來就給你講CObject這個類要來的合理些。這裏也就是說,通過msdn,我們瞭解我們要使用的對象的基本原理,然後分析出如何才能實現我們的想法,最後書寫代碼實現。

最後,還是要說,我們要自己培養自己歸納總結的能力,也不要希望mfc一次性就把所有的原理性的東西都給你,比如,由mfc嚮導生成的基本框架,你不可能在msdn一個地方就找到所有你需要的,而是分散在各個地方,比如,你可以查app類,cwnd類,document類,mfc概念,c++編程方法(msdn中的)找到相應的知識,在查看它們的時候,我們不要把注意力注意到單個方法的實現, 而是要理清相互的關係,通過自己不斷的分析總結,歸納,對mfc的理解就會越來越完整,越來越深入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章