CButton 封裝了 Windows 核取方塊 (Checkbox) 與單選鈕 (Radio Button) 兩種控件。單選鈕用於互斥選項群組,核取方塊支援多重選擇。本文系統說明對話框編輯器對齊技巧、Tab Order 群組邏輯、六種程式碼操作方式,並附完整範例表格。
Group = True,其餘 Group = False。Group=True 開始,到下一個 Group=True (不含) 結束,形成一個互斥群組。| 控件類型 | ID | 標題 | Group 屬性 |
|---|---|---|---|
| Group Box | - | 性別 | - |
| Radio Button | IDC_SEX1 | 男 | True |
| Radio Button | IDC_SEX2 | 女 | False |
| Group Box | - | 愛好 | - |
| Checkbox | IDC_HOBBY1 | 足球 | - |
| Checkbox | IDC_HOBBY2 | 排球 | - |
| Checkbox | IDC_HOBBY3 | 籃球 | - |
// 設定:0=未選、1=選、2=不確定 (三態核取方塊)
m_btnSex1.SetCheck(1); // 選中「男」
m_btnHobby1.SetCheck(1); // 選中「足球」
// 讀取
int nState = m_btnSex1.GetCheck(); // 0, 1, 或 2
BOOL bChecked = (nState == 1);
注意:程式碼 SetCheck(1) 不會自動清除同群組其他單選鈕,必須手動 SetCheck(0) 其餘項目,否則會出現多項同時選中的非法狀態。
UINT nSex = GetCheckedRadioButton(IDC_SEX1, IDC_SEX2);
switch (nSex)
{
case IDC_SEX1: /* 男 */ break;
case IDC_SEX2: /* 女 */ break;
case 0: /* 無選擇 */ break;
}
陷阱:函式依 ID 數值大小 判斷範圍,而非 Tab Order。若 IDC_SEX1 > IDC_SEX2 會永遠回傳 0。解決:手動修改 Resource.h 確保同群組 ID 連續遞增。
int 變數 (如 m_nSex)。值:0=第一項、1=第二項、-1=無選擇。BOOL 變數 (如 m_bHobby1)。TRUE=選中、FALSE=未選中。
// 讀取 UI → 變數
UpdateData(TRUE);
if (m_nSex == 0) /* 男 */;
else if (m_nSex == 1) /* 女 */;
// 變數 → 更新 UI
m_bHobby1 = TRUE;
UpdateData(FALSE);
避免為每個單選鈕/核取方塊建立獨立處理函式。手動在訊息映射區加入:
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
//{{AFX_MSG_MAP(CMyDialog)
//}}AFX_MSG_MAP
ON_CONTROL_RANGE(BN_CLICKED, IDC_SEX1, IDC_SEX2, OnSexClicked)
ON_CONTROL_RANGE(BN_CLICKED, IDC_HOBBY1, IDC_HOBBY3, OnHobbyClicked)
END_MESSAGE_MAP()
標頭檔宣告:afx_msg void OnSexClicked(UINT nCmdID);
實作:switch(nCmdID) { case IDC_SEX1: ... }
條件:ID 必須連續。用 View → Resource Symbols 檢查並調整。
if (IsDlgButtonChecked(IDC_SEX1)) // 非 0 表示選中
/* 男被選中 */;
回傳值:1=選中、0=未選中、2=不確定 (三態)。
屬性 Tristate = True 可呈現「灰色不確定狀態」。常用於安裝精靈:父項目灰色表示「部分子功能已選」。程式碼控制:SetCheck(2) 設為不確定狀態。
SetCheck(1) / SetCheck(0) 維護互斥。GetCheckedRadioButton 陷阱。掌握上述技巧,即可靈活駕馭 VC++ 中的核取方塊與單選鈕,建構直覺易用的選項介面。