按鈕訊息
按鈕可以將訊息傳送至其父視窗,而父視窗可以將訊息傳送至按鈕。
本節將討論下列主題。
將訊息傳送至按鈕
父視窗可以使用 sendMessage 函式,將訊息傳送至重疊或子視窗中的按鈕, 或者,它可以使用 sendDlgItemMessage、CheckDlgButton、CheckRadioButton,以及 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_COMMAND 或 WM_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_DISABLE、BN_PUSHED、BN_KILLFOCUS、BN_PAINT、BN_SETFOCUS和 BN_UNPUSHED 通知碼。 BN_DBLCLK 通知碼會自動傳送給 BS_USERBUTTON、BS_RADIOBUTTON和 BS_OWNERDRAW 按鈕。 其他按鈕類型只有在具有 BS_NOTIFY 樣式時,才會傳送BN_DBLCLK。 不論按鈕樣式為何,所有按鈕都會傳送 BN_CLICKED 通知程序代碼。
針對自動按鈕,系統會變更推送狀態並繪製按鈕。 在此情況下,應用程式通常只會處理 BN_CLICKED 和 BN_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_LBUTTONDOWN 和 WM_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_PAINT 和 WM_ENABLE 處理的一部分。 | ||||||||||||||||
WM_GETDLGCODE | 傳回值,指出預設按鈕程式所處理的輸入類型,如下表所示。
|
||||||||||||||||
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 函式,以進行默認處理。
相關主題