MFC的訊息機制學習

2021-08-22 17:17:29 字數 2667 閱讀 8004

一.sendmessage()與postmessage()

1.sendmessage():

被傳送的訊息直接呼叫該視窗的視窗程序,通訊是即時的,直到視窗程序為呼叫函式返回乙個結果後,程式才能繼續;

2.postmessage():

把訊息傳送到擁有那個視窗的應用程式訊息佇列中,一有空閒,程式搜尋訊息佇列,並在訊息佇列中處理訊息,即從訊息佇列中刪除它們,並將它們傳送到指定視窗;呼叫函式傳送訊息後就返回,結果只表示訊息寄送成功與否,而不是被呼叫程序的結果.

3.比較:

滑鼠與鍵盤訊息通常為postmessage,其他訊息通常為sendmessage;

4.mfc傳送訊息:

a.lresult res= pwnd->sendmessage(uint msg, wparam wparam, lparam lparam); pwnd指標指向目標cwnd類物件;

b.傳送訊息到乙個沒有cwnd類物件的視窗: lresult res = ::sendmessage(hwnd hwnd, uint msg, wparam wparam, lparam lparam); hwnd為目標視窗控制代碼

5.mfc寄送乙個訊息:

用postmessage(),返回值與sendmessage()不同,為乙個bool值,表示是否放入訊息佇列; 檢索乙個寄送訊息:

兩種刪除訊息佇列中的訊息:

a.看訊息是否在:

bool res = ::peekmessage(lpmsg lpmsg, hwnd hwnd, uint wmsfiltermin, unit wmsgfiltermax, uint wremovemsg);

b.等待訊息並刪除:

bool res = ::getmessage(lpmsg lpmsg, hwnd hwnd, uint wmsgfiltermin, uint wmsgfiltermax);

二.mfc中的三種訊息型別:

視窗訊息,命令訊息,控制項通知

1.視窗訊息: 建立,刪除,銷毀視窗,

訊息格式:message:wm_***

wparam: 定義的命令

lparam: 定義的命令

2.命令訊息:與使用者請求相關,單擊工具欄與選單

訊息格式:

message:wm_command

wparam:0 or commandid

lparam:0

有些控制項通知也用wm_commadn,兩種訊息唯一區分方法是lparam是否為null;

3.控制項通知:如開啟組合框

三種格式:

1.message:wm_***

wm_parentnotify, wm_hscrol等

wparam:定義的命令

lparam定義的命令

2. message:wm_commadn

wparam:xn_***, 控制項id, eg.en_change;

lparam:視窗控制代碼

3.message:wm_notify

wparam:控制項id

lparam:指向nmhdr的指標,此結構包括通知控制項的任何內容nmhdr:通知訊息頭(notification message header)

三mfc接收乙個寄送的訊息

第一部分:執行後台處理:如取消臨時cwnd物件

第二部分:檢查訊息佇列:新訊息進來時.run()用getmessage()從佇列中取出它,執行兩個翻譯函式,然後用dispatchmessage()呼叫此訊息預期的目標視窗程序;其中兩個翻譯函式為:

a.pretranslatemessage():

mfc類用它在傳送訊息給它前進行訊息翻譯,如將加速鍵轉換成命令訊息;

b.::translatemessage()為乙個視窗函式,將原始鍵碼轉換成鍵字元訊息被dispatchmessage()傳送後,處理它就跟sendmessage()傳送的訊息一樣了.

四.mfc處理乙個接收到的訊息;

目的:將訊息指向乙個函式;

非mfc中:

mainwndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam) return(null); }

1.afxwndproc()接收訊息,尋找訊息所屬cwnd物件,然後呼叫afxcallwndproc()

2.afxcallocwndproc()儲存訊息供以後參考,然後呼叫windowproc()

3.windowproc()傳送訊息給onwndmsg(),然後,如果訊息未被處理,剛傳送給defwindowproc()

4.onwndmsg()要麼為wm_commadn訊息呼叫oncommand(), 要麼為wm_notify訊息呼叫onnotify() onwndmsg()查詢類的訊息映像,以找到乙個能處理任何訊息的處理函式,如果沒找到,就把訊息返回到windowproc(),由它把訊息傳送給defwindowproc();

5.oncommand()檢視是不是乙個控制項通知(lparam不是null),如是,oncommand就將訊息對映到製造通知的控制項;如不是.或者控制項拒絕對映的訊息,oncommand()就呼叫oncmdmsg();

onnotify()也試圖將訊息對映到製造通知的控制項,如不成功,onnotify()就呼叫相同的oncmdmsg();

mfc程式不用

case,

其處理方式如下

,指引輸入訊息到處理函式

MFC的訊息機制學習

一 sendmessage 與postmessage 1.sendmessage 被傳送的訊息直接呼叫該視窗的視窗程序,通訊是即時的,直到視窗程序為呼叫函式返回乙個結果後,程式才能繼續 2.postmessage 把訊息傳送到擁有那個視窗的應用程式訊息佇列中,一有空閒,程式搜尋訊息佇列,並在訊息佇列...

MFC 訊息機制

windows應用程式是通過訊息驅動的,在mfc軟體開發時,進行介面操作經常要用到訊息,通過訊息對應的處理函式來實現響應的操作。比如,使用者操作視窗,就會產生訊息,送給對應的訊息處理函式進行處理,對使用者的操作做出一些反應。mfc使用訊息對映機制來處理訊息,具體表現就是訊息和訊息處理函式一一對應的訊...

MFC訊息機制

一 訊息的分類 1 佇列訊息 非佇列訊息 l佇列訊息 windows 為每個應用程式都建立乙個訊息佇列,那麼通過訊息佇列,進行傳送的訊息都屬於佇列訊息 一般來說,由滑鼠 鍵盤產生的訊息都屬於佇列訊息。為什麼呢?想想,滑鼠 鍵盤事件都是由系統捕獲的,系統捕獲後要傳遞給應用程式,就一定的通過訊息佇列 l...