MFC(三) 視窗建立機制編故事(下)

2021-07-06 02:19:44 字數 2361 閱讀 1460



第三天,訊息攔截與處理

埋鉤子:

hhook

setwindowshookex

(//埋勾子

_in_

intidhook

,//勾子型別(

wh_cbt)

_in_

hookproc

lpfn

, //勾子處理函式

_in_opt_

hinstance

hmod

, //程序控制代碼

_in_

dword

dwthreadid

)//執行緒

id };

//分全域性勾子和區域性勾子(全域性可以勾取其它程序訊息)

組長叫情報小隊長去安插內線:

void

afxapi

afxhookwindowcreate

(cwnd

* pwnd)

於是小隊長先登記了任務號,從傳遞臺得到這次總任務的資訊:

_afx_thread_state

* pthreadstate

= _afxthreadstate

.getdata

();

然後,安插了乙個內線在建造局,囑咐不要暴露了,除了

視窗建立成功訊息

外,不要管;一旦視窗建立成功,一定比別人先拿到這個訊息,通知「

鉤子哥」進行處理

pthreadstate

->

m_hhookoldcbtfilter

= ::

setwindowshookex

(wh_cbt,

_afxcbtfilterhook

, null

, ::

getcurrentthreadid

());

鉤子哥收到訊息後首先登記,並從傳送臺取得主任務的有效資料

_afx_thread_state

* pthreadstate

= _afxthreadstate

.getdata

();

會先一步處理掉一些障礙,先取得任務的委託人要求的視窗

cwnd

* pwndinit

= pthreadstate

->

m_pwndinit;

並從內線提供的資訊中,確定建造局建造的位置(視窗控制代碼)

hwnd

hwnd

= (hwnd

)wparam

;//獲取剛剛建立的視窗控制代碼

把兩者的繫結,這樣以後委託人說我的東西,行動組就能馬上找到建造的位置,反過來也是如此,看到一幢房子,就知道是誰名下的~

好吧,其實建造局只管建立房子,是誰的他們不管,他們留下(hwnd

)鑰匙就走了,而業主需要拿著證明來接收房子~

pwndinit

->

attach

(hwnd);

接下來,管家出現,把大門鑰匙、客廳鑰匙、會議室鑰匙、儲藏室鑰匙......

全拿到,為了讓業主不會混淆,買了一塊鑰匙箱(

map類陣列),把鑰匙放到對應房間的標籤格仔中~

chandlemap

* pmap

= afxmaphwnd

(true

) ......

pmap

->

setpermanent

(m_hwnd

= hwndnew

, this

); m_permanentmap

[(hwndnew)

] = 

permob

(pframe);

在莊園裡,有自己的保安、供水、食物系統,一般的問題都會通知管家,由管家找相關人員處理,如果處理不了的或不需要內部處理的,通知外界來處理(系統的defaultproc)

wndproc

afxwndproc

= afxgetafxwndproc

();

setwindowlong

ptr(

hwnd

, gwlp_wndproc

,(dword_ptr

)afxwndproc)

建立視窗分兩步, ø 

註冊 ø 

視窗就像是外形,而處理函式就像是隱藏在外觀內部的功能和邏輯,或者說造成乙個機械人,外形是個機械人,它還需要能動,能走,能說話。

在mfc

的視窗建立機制中,第一步是通過**的方式,最終通過

win32 api

向系統註冊;

第二步通過埋下的鉤子,在視窗建立成功時,把相應的

功能植入

進去。

MFC 使用MFC建立視窗

標頭檔案 mfc是乙個封裝了windowsapi且物件導向的c 類庫,同時也是乙個應用程式的框架結構。另外,並非所有mfc提供的函式都是類的成員,mfc也以 全域性函式的形式,為使用者提供了各類字首為afx的函式,可供使用者在必要時隨時隨地進行呼叫。由mfc建立的應用,我們不能夠直接看到其程式的入口...

MFC視窗建立過程

本文針對單文件模式的mfc程式進行分析。一步步說明,如何建立視窗並顯示。首先我們建立乙個單文件的mfc程式 test。csingledoctemplate pdoctemplate pdoctemplate new csingledoctemplate idr mainframe,runtime c...

MFC視窗的建立

新建乙個空的win32 project 我的編譯器版本vs2013 在新增項中選擇空專案 工程建立完成後,在標頭檔案與原始檔的資料夾中分別新增乙個乙個.h檔案與.cpp檔案起名為mfc.h與mfc.cpp 自擬 在標頭檔案中分別建立應用程式類與視窗架構類,如下 include mfc標頭檔案 cla...