這裡簡述一下關於window訊息處理,主要在實際應用中;
在乙個windows程式中,乙個程式的的訊息是通過乙個大迴圈來實現接收處理的;
這個可以檢視win32程式的編寫,具體可以詳細查詢相關資料;
在windows程式設計中,尤其是mfc程式中,關於視窗訊息是非常重要的;
視窗過程函式(接收處理視窗訊息的函式),函式的主要實現在cwnd中:
lresult cwnd::windowproc(uint message, wparam wparam, lparam lparam)
有上述**可以看出,windowproc接收到視窗的訊息,首先給onwndmsg處理,然後判斷是否給defwindowproc處理;
關於:bool cwnd::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult);
從上面的**可以看出,所有被視窗過程函式windowproc接收的訊息,首先給onwndmsg處理;
onwndmsg函式同城處理的就是在視窗中新增的訊息函式
下面給出應用的示例:
新增對話方塊onwndmsg虛函式實現;
新增對話方塊defwindowproc虛函式實現;
新增對話方塊onlbuttondown想要訊息函式;
bool ctmfcdlg::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult)
return cdialogex::onwndmsg(message, wparam, lparam, presult);
}lresult ctmfcdlg::defwindowproc(uint message, wparam wparam, lparam lparam)
return cdialogex::defwindowproc(message, wparam, lparam);
}void ctmfcdlg::onlbuttondown(uint nflags, cpoint point)
然後滑鼠右鍵單擊對話方塊,會依次彈出:
onwndmsg
onlbuttondown
defwindowproc
通過這個函式可以看出,onwndmsg會將相關的訊息通過訊息表分發給相關的訊息實現函式;
如果取消cdialogex::onlbuttondown(nflags, point);這句話,則defwindowproc不顯示;
或者,在onwndmsg中的相應訊息後,return 1; 表示訊息已經處理過了,不在向下傳遞;
自定義訊息:
一般的自定義訊息,可以通過模仿onbuttonclick訊息的方法實現:
一般實現過程是:
定義 自定義訊息
在標頭檔案新增afx 函式,引數為wparm和lparm;
在cpp檔案中的視窗的訊息表begin_message_map中新增訊息關聯,
在cpp檔案中實現函式;
但是這個過程有點麻煩,而且破壞了mfc的嚮導生成的**,在vc6以後沒有影響,只是不好看而已;
通過文章前面的描述,可以知道onwndmsg虛函式接收處理所有的視窗訊息,所以可以通過過載onwndmsg函式,然後判斷,如果訊息等於自定義訊息就直接處理;
這樣程式會簡明很多;
當然onwndmsg中可以處理所有的windows視窗訊息,但是如果是windows視窗訊息,如果沒有特殊處理,一般還是建議用新增訊息函式的方法新增處理,就是在類的屬性中新增相應的訊息函式,不用將所有的訊息處理放到onwndmsg中;
Windows鍵盤訊息處理
本文大部分來自msdn和的部落格,我在實踐的基礎上再作了一些總結。1,虛擬鍵 vk 鍵盤上每乙個鍵對應乙個掃瞄碼,掃瞄碼是oem廠商制定的,不同的廠商生產的鍵盤同樣乙個按鍵的掃瞄碼都有可能出現不一致的情況,為了擺脫由於系統裝置不一致的情況,通過鍵盤驅動程式將掃瞄碼對映為統一的虛擬鍵碼表示,從而達到所...
WPF處理Windows訊息
wpf中處理訊息首先要獲取視窗控制代碼,建立hwndsource物件 通過hwndsource物件新增訊息處理 函式.hwndsource類 hwndsource class implements its own window procedure.實現其自己的視窗過程。建立視窗之後使用 addhoo...
在QT中處理windows訊息
為了能處理某些qt無法處理的事件,或者在qt將訊息封裝之前能做某些操作等等,我們可以自己處理windows事件。cpp view plain copy class public 然後我們將此函式補充完全 cpp view plain copy intargc,char bool long resul...