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