一.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...