mfc的訊息處理機制由兩部分組成:ccmdtarget類和訊息對映表。
所有的視窗訊息由3部分組成
uintmsg
,
wparamwparam
,
lparamlparam
因為,虛函式是使用類的虛函式表實現的,每個派生類都會帶乙個虛函式表的拷貝。虛函式表中的每個入口都是乙個4位元組指標,這樣每個類物件就會在虛函式表中帶來大量的額外位元組。同時,視窗訊息的個數和種類隨時會發生變化,在訊息改變時,使用虛函式實現的訊息機制容易導致**的廢棄
mfc的訊息對映技術由兩部分組成:ccmdtarget類 和 訊息對映表。ccmdtarget是所有接受視窗訊息和命令物件的基類,為了接受訊息,類必須從ccmdtarget派生。訊息對映表是將視窗訊息與處理訊息的類成員函式關聯起來的機制。訊息對映表資料結構和訊息對映巨集是訊息對映系統的另外的兩個重要的方面。
(a) 兩個訊息對映表資料結構
afx_msgmap_entry 訊息對映項 ( 見afxwin.h )
afx_msgmap 訊息對映表 ( 見afxwin.h )
(b) 訊息對映巨集
mfc提供了三個巨集來產生訊息對映表:declare_message_map、begin_message_map、end_message_map。要在類中使用訊息對映表,最基本的辦法是在類宣告中包含declare_message_map (.h檔案),在類實現體中包含begin_message_map、end_message_map和訊息對映資訊(.cpp檔案)
declare_message_map ( 見afxwin.h )
定義了兩個protect函式,getthismessagemap用於返回本類中的訊息對映表指標,getmesssagemap是個虛函式
begin_message_map ( 見afxwin.h )
getmessagemap 和 getthismessagemap函式的實現,在getthismessagemap中乙個函式中定義了兩個函式靜態變數:_messageentries 表示所有的訊息對映項、messagemap表示訊息對映表(見下)
end_message_map ( 見afxwin.h )
begin_message_map 和 end_message_map之間的內容是一系列訊息對映表的入口巨集。這些巨集擴充套件後可以填充類的訊息對映表_messageentries。mfc定義的各種訊息對映表入口巨集,見下表
(3)mfc定義各種訊息對映表入口巨集
訊息型別
巨集形式
引數
預定義視窗訊息
on_wm_***x
none 命令
on_command
command id, handler name 命令
id的範圍
on_command_range
start id, end id,
handler name
更新命令
on_update_command_ui
commnad id, handler name
用於更新的命令
id的範圍
on_update_command_ui_range
start id, end id,
handler name
控制項通知
on_***x
control id, handler name 控制項
id範圍
on_control_range
notify code
、start id
、end id
、handler name
使用者定義的訊息
on_message
user-defined message id,
handler name
註冊的視窗訊息
on_registered_message
registered message id variable, handler name
handler訊息處理機制
handler主要用來更新ui 因為涉及到執行緒安全,android必須在ui執行緒 即主線程 裡才能更新ui,在其他執行緒裡更新ui會報錯,而一些耗時的操作又必須通過開啟新的執行緒來執行,這就要用到handler來傳遞訊息了。在主線程中建立乙個handler的例項,並重寫handlermessag...
非同步訊息處理機制
借鑑 為什麼不能在子執行緒更新ui?1 ui是非執行緒安全的,主線程和子執行緒同時更新ui的話會導致錯誤,如ui錯亂之類的。2 ui更新是很耗效能的,更別說為了執行緒安全加鎖了,最簡單的方法就是更新ui的操作放到乙個執行緒中,即主線程 handler機制 looper 維持乙個thread物件以及m...
Handler訊息處理機制
剛開始接觸android,邊學習邊做筆記,希望大家多指正。經常在 中看到sendmessage 族的一些函式,開始時總搞不明白訊息傳送到 去了,誰去處理,什麼時候處理。下面是問題解答。至於開始的幾個疑問,我是這樣理解的。訊息傳送出去,就相當於馬上要被處理了。就像進地鐵一樣,已經站到了進站的佇列中 假...