《MFC windows程式設計(第二版)》是一本介紹使用MFC(而不是win32 API),進行32位Windows應用程式設計的經典書籍。作者Jeff Prosise,被譽為MFC領域的Petzold。作者在前言中寫道:“我的目標就是為C++程式員寫出一本可與為C程式員所寫的那本永恒的、無出其右的《Programming Windows》相媲美的好書。”
這本書與眾不同之處在於它不以Appwizard嚮導建立程式開始,而是直接使用MFC類庫,利用各類之間的耦合自建程式,比起其他(尤其是千篇一律的國內)書籍來,能給人耳目一新的感覺。
我是在學校圖書館發現這本書的,當時的感覺是:媽的,人生的大起大落,真是太刺激了。怎麼也沒想到在那一堆老古董裡還有這麼新的經典。
我希望能用一個暑假搞定它,學完每一章,我都會把讀書筆記和一些自己的想法寫個文檔放上來,希望能給沒我幸運的各位網友一些協助。
因為“每天你都有機會跟別人擦身而過,你也許對他一無所知,不過也許有一天他會變成你的朋友或是知己。”,希望大家支援。
第一章、Hello MFC
精華濃縮:
我們大家都知道每一個Windows程式都以一個Winmain()開始,MFC的當然不例外。但在MFC中,它被隱藏了起來。MFC定義了一個全域應用程式物件(姑且稱其為theApp),而每一個全域對象都是在主程式進入點(EntryPoint)之前由啟動代碼構造完成的。換句話說,程式在進入Winmain()之前,記憶體中將有了一個theApp對象。這樣,theApp的成員函數就可以為我們所用了。也就是這時,Winmain()出場了...
Winmain()首先調用theApp(就是應用程式類)的成員函數InitInstance()虛函數(要覆蓋),構造主表單,並顯示更新,之後再調用Run()(一般不要覆蓋),就進入訊息迴圈。
在SDK程式設計時,訊息總是以調用一個視窗的視窗過程(WndProc())來表明自己的存在。同時與此調用相伴隨的通常是四個參數:訊息所指視窗控制代碼、一個訊息ID和兩個名為wParam和lParam的32位參數。後兩個參數值依訊息不同而異。而在MFC中,訊息映射取代了視窗過程作為訊息與其處理之間的通訊介面。
從CCmdTarget派生的任何類都可以包含訊息映射。訊息映射是一個將訊息與其處理函數(作為類的成員函數)相互關聯的表。它是MFC避免使用冗長的虛函數表(VTable)的一種方式(試想,如果每一個進入記憶體中的類有一個虛函數表,則每一個類對象執行個體就都要有一個指標VPointer(4位元組)指向那個表,這個記憶體消耗是沒法估量,也是多餘的)。MFC用三個宏就解決了問題。
因此,將一個訊息映射添加到一個類中,要做三項工作:
1)通過將DECLARE_MESSAGE_MAP語句添加到類聲明中,聲明訊息映射;
2)通過放置標示訊息映射起止的宏執行訊息映射,相應的類將在對BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的調用之間訊息和其處理函數;
3)新增成員函數定義處理訊息。
關於訊息映射工作機制的情況,有興趣的網友可以參考《深入淺出MFC》,那裡講的很詳細。
這本書也提供了自建Windows程式的方法,在New-Project中選Win32 Application,再在接下來的視窗中選A Empty Project。進入主環境之後,再用Project-Add To Project添加檔案即可。編譯之前,記著把編譯選項改為Use MFC In A Shared DLL。
一些知識點:
1)匈牙利標記法:在每個變數名之前,用一個或多個小寫字母標識變數類型。同時成員變數以m_開頭。如m_strWndClass,m_表示這是個類資料成員,str表示這是類型為CString類的變數。常用類型首碼:b-BOOL,h-Handle,n-Int,l-long Int等。
2)文檔/視圖結構:使資料和資料的表現相分離,以簡化程式設計的一種程式結構,後有章節詳述。
3)CObject:大多數MFC類從CObject中直接或間接派生,它為其衍生類別提供了三個重要特性:序列化支援;運行期類型資訊;診斷與調試支援。
4)Afx函數:Afx是Application Framework的簡寫,以Afx開頭的函數都是全域函數,可以在任一個類實現中調用。典型的如AfxMessageBox()、AfxGetApp()等。
5)_T宏:用來將字串常量字元設定為“中性”。這樣不管是ANSI字元集還是Unicode,字串都將與系統無關。關於_T的詳細資料,作者建議閱讀Jeffrey Richter的《Advanced Windows》或MSDN。