天天看點

有關模态對話框對ESC和ENTER鍵的處理。

一、關于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輸入。

繼續閱讀