系統理解Win32 API和MFC 上

2022-09-17 14:30:11 字數 2079 閱讀 1805

系統理解win32 api和mfc(上)

作者主頁: lcspace.diy.163.com

win32 api的object有3種:user obj,gdi obj,kernel obj。但是,如果一點不考慮os本身的支援,就會在有些問題上疑惑,因此,我這裡把「operation system負責將中斷封裝成message」加上。

1、user obj、gdi obj、kernel obj、system 4者的關係

由於是kernel obj部分負責將另外3者聯絡起來,因此我們在下圖中直接深入到kernel obj部分內部。

從圖中看到,在記憶體中執行的,除了「負責將中斷封裝成message」的system支援部分,還有另外3類object:kernel obj、user obj和gdi obj,每個obj都有乙個控制代碼handle與之對應。其中,gdi obj建立了待開發的windows 應用和外部輸出裝置的聯絡,kernel obj中的file建立了記憶體和永久儲存裝置的聯絡。具體說,記憶體中的file從可以從硬碟上來,如果這個file是可執行檔案,它將生成module,module執行起來就是process,process可以包含多條thread,而thread的執行映象最終還是來自於file。thread是kernel obj中最重要的乙個,因為訊息佇列就是thread擁有的,只有thread才能夠接受message。對gdi obj、urser obj和file的操作,也是發生在thread中的。所以書都講,process至少擁有乙個thread。

2、展開「system負責將中斷封裝成message」部分

下面展開「system負責將中斷封裝成message」部分,盡早解除對「message到底是怎麼形成的」的困惑。

3、展開「gdi obj」部分

4.1 第1次迭代

window在windows應用開發中占有重要地位。

從圖中看到,window可分為3種:desktop,top-level window,child window。所有window被os組織成tree,有專門的資料結構來管理。desktop就是樹根,desktop的子節點是top-level window,top-level window的子節點是child window,child window仍然可以有子節點,同樣歸屬於child window。tree資料結構中還記錄了4種重要資訊,是4種指標:parent指標、child指標、brother指標、owner指標。這樣,從任何乙個window就能很容易地找到其它window了。

好了,暫且得到 window = desktop + toplevel + child 的結論,看看全域性先。畢竟,一步到位有時候並不好。

從圖中看到,window確實占有重要地位。從邏輯是講,thread是window的擁有者;但是,所有window一起決定了螢幕看起來是上面樣子,何況點選任何乙個window都會使window得相互覆蓋關係發生變化,對所用window進行統一管理是必須的,所以os又不得不統一用window tree來管理window,反映複雜的window關係。每個window都必須有乙個且只能有乙個客戶區,還可能有乙個title bar。

再來看看createwindow()函式的inte***ce spec透露了哪些資訊。

從圖中看到,createwindow()負責為window建立與視窗類的聯絡。每個window都有乙個視窗類與之對應,而乙個視窗類可以對應多個window。視窗類中記錄了視窗函式和選單等資源資訊,而由file生成的module正是視窗函式和資源的老家。

4.2 第2次迭代

考察訊息種類。

從圖中看到,每個message都是傳送給某個window的。注意,msg可由sys**產生,也可以由api函式產生。

進一步考察window,深入toplevel和child。

總結user obj:

createdialog()函式示意:

從圖中看到,createdialog()和createwindow()最大的區別就是,它有對話方塊模板支援方便地定製dialog介面。注意,dialog是特殊的window,視窗類它一定也是有的。

系統理解Win32 API和MFC

溫昱 作者主頁 lcspace.diy.163.win32 api是微軟的作業系統windows提供給開發人員的程式設計介面,它決定了我們開發的windows應用程式的能力。mfc是微軟為開發人員提供的類庫,在某種意義上是對win32 api的封裝。本文試圖從全域性角度對win32 api和mfc進...

win 32Api獲取系統記憶體函式

windows程式設計中 獲取系統記憶體資訊有2個api,分別是globalmemorystatus和globalmemorystatu globalmemorystatus函式可以在c語言咧直接呼叫,但是globalmemorystatu 卻不可以直接呼叫,因為globalmemorystatu ...

掃雷程式 win32API

1 已實現功能 基本的掃雷方塊的展開,方塊周圍雷數的計算,方塊的標旗,勝負的判斷,難度的更改 2 未實現功能 控制台顯示剩餘標旗數量和當前所用時間,選單項的豐富 3 基本原理 使用一張二維int表儲存每個方格的數字資訊,其中9表示雷 將整個雷區 客戶區 按難度分割成方格,每個方格為乙個靜態控制項,用...