1、WM_SYSCOMMAND
OnSysCommand()這個函數主要是截獲控制指令的,msdn上的解釋如下:
The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.
對于Windows菜單中菜單項和加速鍵(加速鍵指跨界按鈕?),點選後,Windows會向所屬的窗體發送WM_SYSCOMMAND,而不是WM_COMMAND消息。
注意:WINDOWS菜單是系統菜單,也就是在标題欄點選滑鼠左鍵的時候彈出的菜單。尤其是最大化和最小化視窗的時候,比如現在軟體的流行的點關閉按鈕,不是退出而是隐藏的情況,就可以在這裡來實作。
參考:https://blog.csdn.net/autumn20080101/article/details/7577619
https://blog.csdn.net/gxj1680/article/details/3549656
原型:afx_msg void OnSysCommand( UINT nID, LPARAM lParam ),參數:
nID | 指定了請求的系統指令的類型。這個參數可以是下列值之一:
| ||||||||||||||||||||||||||||||
lParam | 如果控制菜單是通過滑鼠選擇的,則lParam中包含了光标的位置。低位字包含了x軸坐标,高位字包含了y軸坐标;否則這個參數沒有使用。
|
說明:
當使用者從控制菜單選擇了一個指令,或者使用者選擇了最大化戶最小化按鈕時,架構調用這個函數。
在預設情況下,OnSysCommand執行控制菜單對前面表格中描述的預定義動作的請求。
在WM_SYSCOMMAND消息中,nID參數的低四位被Windows内部使用。當應用程式測試nID的值時,它必須用位與操作符AND将值0xFFF0與nID的值組合在一起以獲得正确的結果。
為選擇控制菜單中的項的加速鍵(快捷方式)被轉換為OnSysCommand調用;所有其它的加速鍵被轉換為WM_COMMAND消息。
參考:https://blog.csdn.net/trustnature/article/details/7793905
2、WM_COMMAND
WM_COMMAND産生的條件:點選菜單, 點選加速鍵,點選子視窗按鈕,點選工具欄按鈕。這些時候都有command消息産生。
WM_COMMAND消息中有兩個參 數,wparam、lparam,定義如下:
wParam 高兩個位元組 通知碼
wParam 低兩位元組 指令ID
lParam 發送指令消息的子窗體句柄。
對于菜單和加速鍵來說,lParam為0,隻有控件此項才非0。指令ID也就是資源腳本中定義的菜單項的指令ID或者加速鍵的指令ID;菜單的通知碼為0;加速鍵的通知碼為1。
參考:https://www.cnblogs.com/qq78292959/p/3564340.html
當使用者點選菜單、按鈕、下拉清單框等控件時候,會觸發WM_COMMAND
LOWORD(wParam) 是控件或菜單或加速鍵的ID,菜單的sparator的ID為0
如果LOWORD(wParam) 是控件ID,HIWORD(wParam)是notification code, 比如BN_CLICKED, BN_DBLCLK等,标志使用者對控件的操作,輕按兩下,單擊之類。
如果LOWORD(wParam) 是菜單ID,HIWORD(wParam)是0。
如果LOWORD(wParam) 是加速符ID,HIWORD(wParam)是1。
如果LOWORD(wParam) 是控件ID,lParam是控件的句柄值,否則為NULL。其實,GetDlgItem(hWnd, LOWORD(wParam)) == lParam。
Notification Code的命名規律:
清單框: LBN_*****
組合框: CBN_****
Tab框: TBN_****
按鈕: BN_*****
Edit : EN_*****
參考:https://blog.csdn.net/qihuanfengyun/article/details/37545723