在 MFC 對話框中實現:兩個按鈕(增量/減量)、一個編輯框顯示數值、兩個複選框(X1/X10)控制步長。點擊「增加」數值 +1 或 +10,「減少」對應 -1/-10,初始值為 0。
遵循「邏輯與界面分離」原則:先實現純數據模型,再綁定 UI 控件。
class CMyDialog : public CDialogEx
{
int m_nValue = 0; // 當前數值
int m_nStep = 1; // 步長:1 或 10
CEdit m_editValue; // 編輯框控件變量
CButton m_chkX1, m_chkX10; // 複選框控件變量
// ...
};
void CMyDialog::UpdateStep()
{
m_nStep = m_chkX10.GetCheck() ? 10 : 1;
// 互斥:勾選 X10 時取消 X1,反之亦然
m_chkX1.SetCheck(m_nStep == 1);
m_chkX10.SetCheck(m_nStep == 10);
}
void CMyDialog::OnBnClickedBtnIncrease()
{
UpdateStep();
m_nValue += m_nStep;
RefreshDisplay();
}
void CMyDialog::OnBnClickedBtnDecrease()
{
UpdateStep();
m_nValue -= m_nStep;
RefreshDisplay();
}
void CMyDialog::RefreshDisplay()
{
CString str;
str.Format(_T("%d"), m_nValue);
m_editValue.SetWindowText(str);
}
BN_CLICKED 消息映射,為複選框添加 BN_CLICKED 同步步長。OnInitDialog 初始化:設置 Edit 只讀、默認勾選 X1、顯示 0。INT_MIN/MAX)。DDX_Text 自動同步 Edit 與 m_nValue,減少手動 SetWindowText/GetWindowText。m_nValue 寫入注冊表/INI,下次打開恢復。| 錯誤 | 原因 | 修正 |
|---|---|---|
| Edit 不顯示更新 | 未調用 UpdateData(FALSE) 或未綁定控件變量 | 檢查 DDX 映射或手動 SetWindowText |
| 複選框互斥失效 | 未在點擊處理中同步另一個框狀態 | 在 OnBnClickedChkX1 中 m_chkX10.SetCheck(FALSE) |
| 步長不生效 | 讀取複選框狀態時機錯誤 | 在增減按鈕處理器開頭調用 UpdateStep() |
MFC 實現帶步長切換的增減控件,關鍵在於:數據模型清晰、消息映射完整、界面刷新及時。遵循「邏輯先行、UI 後綁」原則,代碼易維護、易擴展,新手也能快速上手。