《深入淺出MFC》讀書筆記(一,二) (轉)

worldblog發表於2008-01-22
《深入淺出MFC》讀書筆記(一,二) (轉)[@more@]

以下內容轉自本人自己的blog:builder.blogone">http://springbuilder.blogone.net

因為blogcn總給人不的感覺,現把上面的一些筆記轉到這裡來,權當作為,要是能對大家有一些參考價值,那將是本人極大的榮幸,呵呵。

《深入淺出MFC》讀書筆記(一,二)

今天開始讀《深入淺出MFC》了,順便留下寫東西,以便日後檢視。

第0章(全書概況)
 本書分四大篇:
 第一篇:介紹與MFC相關的基礎知識,如基礎,C++中重要技術,並給出了MFC六大技術的一個簡化模擬。
 第二篇:熟悉Visual C++的整合環境。
 第三篇:(淺出)詳細介紹MFC的來龍去脈。
 第四篇:(深入)介紹各種MFC技術。

 第一篇 
第一章 程式基本概念
 本章主要介紹SDK原理。

 Win32程式開發流程 一個win32程式由兩大塊組成:程式程式碼和介面資源。所有的選單,對話方塊,圖示,游標等屬於使用者介面資源;這些資源的實際內容(二進位制程式碼)由各種工具產生,並以各種副檔名的存在;然後在一個資源描述檔案(.rc)中描述它們。RC編輯器(RC.exe)根據該描述檔案將所有使用者介面資源集中做出一個.RES檔案;最後再與程式程式碼結合起來,構成一個Win32程式。

 關於庫(.LIB) 
 動態連結:應用程式所的Windows 函式是在“期間”才連結上的。相應地,連結時需要連結一些函式庫。

 動態連結庫(DLL)的副檔名不僅可以是.dll,也可以是.exe .fon .mod .drv .ocx等

 Windows可呼叫的函式分C Runtimes 和Windows API 兩部分。
 對前者有
 LIBC.LIB:靜態連結版本
 MSVCRT.LIB:動態連結(MSVCRT40.DLL)的import函式庫,必須有MSVCRT40.DLL支援.
 對後者,Windows API主要由操作本身的三大模組GDI32.DLL,USER32.DLL和KERNEL32.DLL提供,為了能連結到這些庫,必須有相應的import函式庫,分別有GDI32.LIB,USER32.LIB和KERNEL32.LIB.
 另外,Windows還在別的模組中新增了別的API函式.

 標頭檔案 所有的Windows程式都要引入WINDOWS.H,它包括三大模組中所有API函式,當然,可以不引入該標頭檔案,而用分類更細的標頭檔案代替.

 基於訊息的事件 
 訊息可以是由發來的(存於系統佇列),也可以由Windows系統和應用程式發來(存於程式佇列中).
 每一個Windows程式在不停的捕捉各種訊息,並進行處理:
 MSG msg;
 while (GetMessage (&msg,NULL,NULL,NULL)){
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 每個視窗都必須有一個視窗函式,來負責訊息的判斷與處理方式。

一個具體而微的Win32程式
 通常在一些向讀者介紹一門新的語言的書籍中,喜歡在最開頭給出一個最簡單的“Hello World”程式。在有的時候,這樣的小程式確實能讓讀者獲得成就感,瞭解一些最基本的東西,但這樣有時卻不能讓我們窺到程式的全貌。記得當初學時就是從那類小程式開始的,但在碰到用JBuilder生成的最小程式時,卻讓我著實花了不少時間去搞懂它。要讓某種語言寫的程式執行起來可能不是一件困難事,但在一個具體的下,由一個具體的生成的一個較為貼近實際的程式通常都比前者複雜多了。事實上,用vc和jbuilder生成的空白程式通常都比我們自己動手寫的“Hello World”複雜多了。
 Windows程式自然也不例外。因此,與其先給出一個簡單的“Hello World”程式,然後下次在費解的去研究Windows程式的較為通用的,不如索性給出一個較為貼近實際的,比較全面的小例子。侯先生在這裡就是這樣做的。
 
 不過這是我第一次接觸到windows程式設計一些較為底層的東西(雖然以前用過
JBuilder之類的RAD工具),開始時把這一部分粗粗地看了一遍,感覺有的地方不是很好理解。所以,這兩天先把我在網上找到的一份關於sdk程式設計的電子書看了看,好像還不錯,不過我就看了基礎部分。把這份電子文件和這部分結合起來看就容易了很多。

 程式進入點

 當使用者雙擊一個應用程式後,windows的將檢測到這點,並用程式載入器載入該程式。程式淺會新增一段C startup code(如負責全域性靜態的初始化等等),然後透過winmain()進入程式。winmain()的作用就相當於c語言下的main()函式一樣,是程式碼的入口。
 winmain()有四個引數,由windows傳遞進來。個引數代表含義在《sdk程式設計講座》裡有。

 註冊一個視窗類

 這一步相當於為我們將要生成的視窗提供一個模板。我們必須設定這個視窗模板的一些屬性。具體步驟如下:
 1)用WNDCLASS wc;可以宣告一個視窗類;
 2)設定視窗的相關屬性,如
 wc.style=...;
 wc.hIcon=...;
 wc.lpfnWndPorc=...;//關鍵!指定視窗類的視窗函式
 ......
 wc.lpszClassName=...//關鍵!指定所生成的視窗類的類名
 3)向windows註冊該視窗類,以後就可以直接根據該視窗類來生成一個個具體的視窗: 
 RegisterClass(&wc);

 建立一個視窗

 根據上面生成的視窗類建立具體的視窗,並返回視窗的控制程式碼。
 HWND hwnd=CreatWindow(......)
 該函式第一個引數是視窗類名,而不是上面的wc,這個地方容易出錯,我開始就以為是把wc作為第一個引數。

 顯示windows
 上一步只建立而不顯示,必須用showWindow()來顯示。UpdateWindow來傳遞一個WM_PAINT給視窗。

 為了便於理解和使用,上面的RegisterClass()被封裝到InitApplication函式中;而CreateWindow被封裝至InitInstance函式中。這種安排很普遍。不清楚vc裡是不是這樣做的,但記得jbuilder好像是這樣的,雖然函式不一定一樣。

 訊息迴圈
 
 完成上述初始化以後,winmain()進入訊息迴圈:
 while (GetMessage(&msg,...)){ //若不是WM_QUIT訊息,則進入迴圈 
 //否則退出迴圈;
 TranslateMessage(&msg); //轉換鍵盤訊息
 DispatchMessage(&msg);
 }

 
 DispatchMessage(&msg)會把訊息發給相應的視窗函式。之所以能做到這點,因為:
 訊息上帶有作業系統標上的所屬視窗,而視窗所屬的視窗類以及指明瞭相應的視窗函式。

 訊息發給相應的視窗函式後,會引發視窗函式的執行:
 視窗函式處理收到的訊息
 DispatchMessage(&msg)過程在USER模組協助下把訊息發到視窗函式。
 視窗函式是一個回撥函式,即在程式中永遠不需要使用者顯式呼叫,而是windows系統要求程式為之留下的一個通用介面,以便windows來呼叫。
 該視窗函式的形式相當一致,通常名為:WndProc(),每個視窗類必須在初始化時指定一個視窗函式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998160/,如需轉載,請註明出處,否則將追究法律責任。

相關文章