被約束的日日夜夜,停不下來的時(shí)間。
在MFC的消息映射表的建立中,通過一組宏,你就可以讓自己的類先于父類處理某些Windows消息,這種行為很像虛函數(shù),只是我們重載的內(nèi)容不是虛函數(shù),而是消息。
推動(dòng)消息的泵第一階段 窗口過程在產(chǎn)生一個(gè)窗口的時(shí)候,會(huì)調(diào)用CFrameWnd::Create,所有的故事也都從這里展開。下面的代碼為了簡(jiǎn)潔,去掉了不相關(guān)的代碼
這樣,通過AfxHookWindowCreate,在當(dāng)前線程中安裝了一個(gè)鉤子,用來攔截和窗口相關(guān)的事件,每當(dāng):1. 另一個(gè)窗口成為active;2. 產(chǎn)生或摧毀一個(gè)窗口3. Minimize或maximize一個(gè)窗口;4. 移動(dòng)或縮放一個(gè)窗口;5. 完成一個(gè)來自系統(tǒng)菜單的命令;6. 從系統(tǒng)隊(duì)列中取出一個(gè)消息;時(shí),都會(huì)先調(diào)用_AfxCbtFilterHook,接下來看看鉤子函數(shù)作了什么:
這樣,_AfxCbtFilterHook的工作總結(jié)起來就是通過窗口子類化,把新建的窗口的窗口過程設(shè)置成AfxWndProc。到這里,我們終于找到了窗口過程。結(jié)論CFrameWnd::Create創(chuàng)建窗口調(diào)用CWnd::CreateExCWnd::CreateEx調(diào)用AfxHookWindowCreate準(zhǔn)備為窗口設(shè)置鉤子AfxHookWindowCreate調(diào)用::SetWindowHookEx為窗口設(shè)置了一個(gè)WH_CBT類型的鉤子來過濾消息,并把過濾函數(shù)設(shè)置成_AfxCbtFilterHook_AfxCbtFilterHook通過窗口子類化設(shè)置窗口的窗口過程為AfxWndProc這樣,通過::DispatchMessage發(fā)送給窗口的消息就會(huì)源源不斷地送到AfxWndProc中來,可以想到,AfxWndProc利用MFC的消息映射表,分門別類的對(duì)消息進(jìn)行分流。(待續(xù)……)
posted on 2006-05-18 17:29 nacci 閱讀(3843) 評(píng)論(2) 編輯 收藏 引用 所屬分類: C++漫談
明了,收藏! 回復(fù) 更多評(píng)論
字太小了,能大點(diǎn)嗎? 回復(fù) 更多評(píng)論
Powered by: C++博客 Copyright © nacci