訊息處理機制 CCmdTarget 和 訊息對映表

2021-06-20 20:27:31 字數 2659 閱讀 7199

mfc的訊息處理機制由兩部分組成:ccmdtarget類和訊息對映表。

所有的視窗訊息由3部分組成

uintmsg

wparamwparam

lparamlparam

因為,虛函式是使用類的虛函式表實現的,每個派生類都會帶乙個虛函式表的拷貝。虛函式表中的每個入口都是乙個4位元組指標,這樣每個類物件就會在虛函式表中帶來大量的額外位元組。同時,視窗訊息的個數和種類隨時會發生變化,在訊息改變時,使用虛函式實現的訊息機制容易導致**的廢棄

mfc的訊息對映技術由兩部分組成:ccmdtarget類 和 訊息對映表。ccmdtarget是所有接受視窗訊息和命令物件的基類,為了接受訊息,類必須從ccmdtarget派生。訊息對映表是將視窗訊息與處理訊息的類成員函式關聯起來的機制。訊息對映表資料結構和訊息對映巨集是訊息對映系統的另外的兩個重要的方面。

(a) 兩個訊息對映表資料結構

afx_msgmap_entry 訊息對映項  ( 見afxwin.h )

[cpp]view plain

copy

struct afx_msgmap_entry  

;  

afx_msgmap 訊息對映表 ( 見afxwin.h )

[cpp]view plain

copy

struct afx_msgmap  

;  

(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 )

[cpp]view plain

copy

#define declare_message_map() /  

protected: /  

static const afx_msgmap* pascal getthismessagemap(); /  

virtual const afx_msgmap* getmessagemap() const; /  

定義了兩個protect函式,getthismessagemap用於返回本類中的訊息對映表指標,getmesssagemap是個虛函式

begin_message_map  ( 見afxwin.h )

[cpp]view plain

copy

#define begin_message_map(theclass, baseclass) /  

const afx_msgmap* theclass::getmessagemap() const /  

/  const afx_msgmap* pascal theclass::getthismessagemap() /  

/  }; /  

static const afx_msgmap messagemap = /  

; /  

return &messagemap; /  

}  

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 族的一些函式,開始時總搞不明白訊息傳送到 去了,誰去處理,什麼時候處理。下面是問題解答。至於開始的幾個疑問,我是這樣理解的。訊息傳送出去,就相當於馬上要被處理了。就像進地鐵一樣,已經站到了進站的佇列中 假...