一、關于WM_COMMAND消息
操作以下對象會發送WM_COMMAND消息:
操作對象 | wParam高16位 | wParam低16位 | lParam |
菜單 | 菜單ID | ||
加速鍵 | 1 | 加速鍵ID | |
子視窗控件 | 控件通知碼 | 控件ID | 控件句柄 |
不同控件發送的控件通知碼不一樣,如
控件類型 | 按鈕 | 編輯框 | ||
通知碼及意義 | BN_SETFOCUS | 擷取焦點 | EN_SETFOCUS | 擷取焦點 |
BN_KILLFOCUS | 失去焦點 | EN_KILLFOCUS | 失去焦點 | |
BN_CLICKED | 單擊按鈕 | EN_CHANGE | 内容變化 | |
BN_DBLCLK | 輕按兩下按鈕 | EN_HSCROLL | 水準滾動 | |
…… | …… | …… | …… |
舉例:
1、單擊按鈕操作:
系統會向按鈕控件父視窗發送消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + 按鈕ID
lParam == 按鈕句柄
2、選擇菜單項:
系統會像菜單父視窗發送消息:
uMsg == WM_COMMAND
wParam == 0*10000H + 菜單ID
lParam == 0
二、關于BS_DEFPUSHBUTTON風格:
作用:
指定此風格的按鈕外觀不同。若按鈕在對話框中,即使按鈕沒有獲得焦點,仍可以預設用ENTER鍵選擇。
補充:
1、 此風格隻對一般按鈕有效,對單選鈕複選框無效。
2、 若存在多個按鈕被指定此風格,ENTER鍵隻對最後一個按鈕有效。
3、 若沒有按鈕被指定此風格,但存在ID為IDOK的按鈕,則此按鈕被指定此風格。
三、關于對話框預設對ENTER和ESC鍵的處理:
按ESC鍵:
系統會向對話框過程發送消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + IDCANCLE
lParam == IDCANCEL控件的句柄(假如沒有控件ID為IDCANCEL,此參數為0)
按ENTER鍵:
.if 某個一般按鈕子視窗獲得焦點(不包括單選鈕複選框)
系統會向對話框過程發送消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + 獲得焦點的按鈕ID
lParam == 獲得焦點的按鈕句柄
.elseif 存在風格為BS_DEFPUSHBUTTON的一般按鈕:
系統會向對話框過程發送消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + 風格為BS_DEFPUSHBUTTON的按鈕ID
lParam == 風格為BS_DEFPUSHBUTTON的按鈕句柄
.else
系統會向對話框過程發送消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + IDOK
lParam == IDOK控件的句柄(假如沒有控件ID為IDOK,此參數為0)
.endif
四、對話框對關閉操作的預設處理
一般情況下,
1、 點選右上角關閉按鈕
2、 輕按兩下左上角
3、 ALT+F4
4、 點選左上角,出現菜單後點選關閉
以上操作會引發系統向對話框過程發送WM_CLOSE消息,視窗過程對此消息的預設處理是再向視窗過程發送以下消息:
uMsg == WM_COMMAND
wParam == BN_CLICKED*10000H + IDCANCLE
lParam == IDCANCEL控件的句柄(假如沒有控件ID為IDCANCEL,此參數為0)
由此可知系統對WM_CLOSE消息的預設處理和對ESC鍵的預設處理是相同的。
用DialogBoxParam建立的模态對話框,在使用者對話框過程中無法收到WM_KEYDOWN、WM_KEYUP、WM_CHAR消息。但可以利用上面第三條特性處理ESC和ENTER輸入。