按鈕訊息

按鈕可以將訊息傳送至其父視窗,而父視窗可以將訊息傳送至按鈕。

本節將討論下列主題。

將訊息傳送至按鈕

父視窗可以使用 SendMessage 函式,將訊息傳送至重疊或子視窗中的按鈕,或者可以使用 SendDlgItemMessage、CheckDlgButtonCheckRadioButton 和 IsDlgButtonChecked 函式,將訊息傳送至對話框中按鈕。

應用程式可以使用 BM_GETCHECK 訊息來擷取複選框或單選按鈕的核取狀態。 應用程式也可以使用 BM_GETSTATE 訊息來擷取按鈕的目前狀態(檢查狀態、推送狀態和焦點狀態)。 若要取得特定狀態的相關信息,請在傳回的狀態值上使用位掩碼。

BM_SETCHECK訊息會設定複選框或單選按鈕的核取狀態;訊息會傳回零。 BM_SETSTATE訊息會設定按鈕的推送狀態;此訊息也會傳回零。 BM_SETSTYLE訊息會變更按鈕的樣式。 其設計目的是要變更類型內的按鈕樣式(例如,將複選框變更為自動複選框)。 它不是針對在類型之間變更而設計的(例如,將複選框變更為單選按鈕)。 應用程式不應該將按鈕從某個類型變更為另一種類型。

BS_BITMAP或BS_ICON樣式的按鈕會顯示點陣圖或圖示,而不是文字。 BM_SETIMAGE訊息會將句柄與點陣圖或圖示與按鈕產生關聯。 BM_GETIMAGE訊息會擷取與按鈕相關聯之點陣圖或圖示的句柄。

應用程式也可以使用 DM_GETDEFID 訊息來擷取對話框中預設按鈕控件的標識碼。 應用程式可以使用 DM_SETDEFID 訊息來設定對話框的預設按鈕。

呼叫 CheckDlgButton 或 CheckRadioButton 函式相當於傳送BM_SETCHECK訊息。 呼叫 IsDlgButtonChecked 函式相當於傳送BM_GETCHECK訊息。

處理按鈕的訊息

來自按鈕的通知會以WM_COMMANDWM_NOTIFY訊息的形式傳送。 您可以在每個通知的參考頁面上找到哪些訊息的相關信息。

如需如何處理訊息的詳細資訊,請參閱 控制訊息。 另請參閱按鈕訊息。

來自按鈕的通知訊息

當使用者按鍵時,其狀態會變更,而按鈕會以WM_COMMAND訊息的形式將通知碼傳送至其父視窗。 例如,每當使用者選擇按鈕時,按鈕控件就會傳送 BN_CLICKED 通知碼。 在所有情況下(BCN_HOTITEMCHANGE除外),wParam 參數的低序字包含控件標識碼、wParam的高階字包含通知程序代碼,而 lParam 參數則包含控件視窗句柄。

訊息和父視窗的回應都取決於按鈕的類型、樣式和目前狀態。 以下是應用程式應監視和處理的按鈕通知代碼。

通知程序代碼 描述
BCN_HOTITEMCHANGE 滑鼠已輸入或離開按鈕的工作區。
BN_CLICKED 用戶按下按鈕。
BN_DBLCLK或BN_DOUBLECLICKED 用戶按兩下按鈕。
BN_DISABLE 按鈕已停用。
BN_PUSHED或BN_HILITE 使用者按下按鈕。
BN_KILLFOCUS 按鈕遺失鍵盤焦點。
BN_PAINT 應該繪製按鈕。
BN_SETFOCUS 按鈕取得鍵盤焦點。
BN_UNPUSHED或BN_UNHILITE 按鈕已不再按下。

 

只有在BS_NOTIFY樣式時,按鈕才會傳送BN_DISABLEBN_PUSHEDBN_KILLFOCUSBN_PAINTBN_SETFOCUSBN_UNPUSHED通知碼。 BN_DBLCLK通知碼會自動傳送給BS_USERBUTTONBS_RADIOBUTTONBS_OWNERDRAW按鈕。 其他按鈕類型只有在具有 BS_NOTIFY樣式時,才會傳送BN_DBLCLK 。 不論按鈕樣式為何,所有按鈕都會傳送 BN_CLICKED 通知程序代碼。

針對自動按鈕,系統會變更推送狀態並繪製按鈕。 在此情況下,應用程式通常只會 處理BN_CLICKEDBN_DBLCLK 通知碼。 對於非自動的按鈕,應用程式通常會透過傳送訊息來變更按鈕的狀態來回應通知程序代碼。 如需將訊息傳送至按鈕的資訊,請參閱 將訊息傳送至按鈕

當使用者選取擁有者繪製按鈕時,按鈕會傳送其父視窗一則 WM_DRAWITEM 訊息,其中包含要繪製之控件的標識碼,以及其維度和狀態的相關信息。

按鈕色彩訊息

系統提供按鈕的預設色彩值。 應用程式可以藉由呼叫 GetSysColor 函式來擷取這些色彩的預設值,或藉由呼叫 SetSysColors式來設定值。 下表顯示預設按鈕色彩值。

已設定色彩的專案
COLOR_BTNFACE 按鈕臉部。
COLOR_BTNHIGHLIGHT 醒目提示按鈕的上邊緣和左邊緣。
COLOR_BTNSHADOW 按鈕的陰影區域(下邊緣和右邊緣)。
COLOR_BTNTEXT 按鈕中的一般(非草地)文字。
COLOR_GRAYTEXT 按鈕中已停用 (灰色) 文字。 如果目前的顯示驅動程式不支援純灰色,此色彩會設定為 0。
COLOR_WINDOW 視窗背景。
COLOR_WINDOWFRAME 窗框。
COLOR_WINDOWTEXT 視窗中的文字。

 

不過,呼叫 SetSysColors 會影響所有應用程式,因此您不應該呼叫此函式來自定義應用程式的按鈕。

系統會在繪製按鈕之前,將WM_CTLCOLORBTN訊息傳送至按鈕的父視窗。 此訊息包含按鈕裝置內容的句柄,以及子視窗的句柄。 父視窗可以使用這些句柄來變更按鈕的文字和背景色彩。 不過,只有擁有者繪製的按鈕會回應處理訊息的父視窗。

按鈕預設訊息處理

預先定義按鈕控制項視窗類別的視窗程式會針對按鈕控制程式未處理的所有訊息執行預設處理。 當按鈕控制程式傳回 任何訊息的 FALSE 時,預先定義的視窗程式會檢查訊息,並執行下表所列的預設動作。

訊息 默認動作
BM_CLICK 傳送按鈕WM_LBUTTONDOWNWM_LBUTTONUP訊息,並將父視窗傳送BN_CLICKED通知碼。
BM_GETCHECK 傳回按鈕的檢查狀態。
BM_GETIMAGE 如果按鈕沒有點陣圖或圖示,則傳回與按鈕 相關聯的點陣圖或圖示句柄或 NULL
BM_GETSTATE 傳回按鈕目前的檢查狀態、推送狀態和焦點狀態。
BM_SETCHECK 設定單選按鈕和複選框所有樣式的檢查狀態。 如果單選按鈕的 wParam 參數大於零,則會提供按鈕WS_TABSTOP樣式。
BM_SETIMAGE 將指定的點或圖示控點與按鈕產生關聯,並將句柄傳回上一個點或圖示。
BM_SETSTATE 設定按鈕的推送狀態。 對於擁有者繪製的按鈕,如果按鈕的狀態已變更, 則會將WM_DRAWITEM 訊息傳送至父視窗。
BM_SETSTYLE 設定按鈕樣式。 如果 lParam 參數的低序字TRUE,則會重新繪製按鈕。
WM_CHAR 當使用者按下加號 (+) 或等於 (=) 鍵時,檢查複選框或自動複選框。 當使用者按下減號 (–) 鍵時,會清除複選框或自動複選框。
WM_ENABLE 小畫家 按鈕。
WM_ERASEBKGND 清除擁有者繪製按鈕的背景。 其他按鈕的背景會清除為WM_PAINTWM_ENABLE處理的一部分。
WM_GETDLGCODE 傳回值,指出預設按鈕程式所處理的輸入類型,如下表所示。
按鈕樣式 傳回
BS_AUTOCHECKBOX DLGC_WANTCHARS |DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON |DLGC_BUTTON
BS_CHECKBOX DLGC_WANTCHARS |DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON |DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON |DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON |DLGC_BUTTON

 

WM_GETFONT 傳回目前字型的句柄。
WM_KEYDOWN 如果使用者按下空格鍵,則按下按鈕。
WM_KEYUP 釋放 TAB 鍵以外的所有案例的滑鼠擷取。
WM_KILLFOCUS 從按鈕移除焦點矩形。 對於按鈕和預設的按鈕,焦點矩形會失效。 如果按鈕具有滑鼠擷取,則會釋放擷取、未按兩下按鈕,而且會移除任何推送狀態。
WM_LBUTTONDBLCLK BN_DBLCLK 通知程式代碼傳送至父視窗,以取得單選按鈕和擁有者繪製按鈕。 對於其他按鈕,按兩下會以WM_LBUTTONDOWN訊息處理
WM_LBUTTONDOWN 如果滑鼠游標的位置位於按鈕的用戶端矩形內,則反白顯示按鈕。
WM_LBUTTONUP 如果按鈕具有滑鼠擷取,則釋放滑鼠擷取。
WM_MOUSEMOVE 如果按鈕具有滑鼠擷取,則執行與WM_LBUTTONDOWN相同的動作。 否則,不會執行任何動作。
WM_NCCREATE 將任何 BS_OWNERDRAW 按鈕轉換成 BS_PUSHBUTTON 按鈕。
WM_NCHITTEST 如果按鈕控制件是群組方塊,則傳回 HTTRANSPARENT。
WM_PAINT 根據按鈕的樣式和目前狀態繪製按鈕。
WM_SETFOCUS 在取得焦點的按鈕上繪製焦點矩形。 對於單選按鈕和自動單選按鈕,父視窗會傳送 BN_CLICKED 通知碼。
WM_SETFONT 設定新的字型,並選擇性地更新視窗。
WM_SETTEXT 設定按鈕的文字。 在群組方塊的情況下,訊息會在預先存在的文字上繪製,然後以新的文字重新繪製群組方塊。
WM_SYSKEYUP 釋放 TAB 鍵以外的所有案例的滑鼠擷取。

 

預先定義的視窗程式會將所有其他訊息傳遞至 DefWindowProc 函式,以進行默認處理。

控制訊息