標準 MFC 按鈕控制項(CButton)預設為瞬間觸發(按下即放開),不支援「按下鎖定、再按釋放」的切換行為。本文提供兩種實用替代方案。
保持按鈕為普通 BS_PUSHBUTTON,在點擊處理函數中切換按鈕文字與內部狀態旗標。
void CMyDialog::OnBnClickedBtnToggle()
{
if (m_bRunning) {
// 停止邏輯
m_bRunning = FALSE;
m_btnToggle.SetWindowText(_T("啟動"));
} else {
// 啟動邏輯
m_bRunning = TRUE;
m_btnToggle.SetWindowText(_T("停止"));
}
}
優點:無需自訂繪製、相容性佳、使用者直觀理解。
BS_AUTOCHECKBOX 或 BS_CHECKBOX。BS_PUSHLIKE,使其外觀像按鈕但具備鎖定狀態。GetCheck() 判斷狀態:void CMyDialog::OnBnClickedBtnToggle()
{
BOOL bChecked = m_btnToggle.GetCheck();
if (bChecked) {
// 啟動
} else {
// 停止
}
}
優點:原生支援按下/彈起視覺狀態;缺點:外觀與標準按鈕略有差異。
WM_LBUTTONDOWN/WM_LBUTTONUP 手動管理狀態:易導致焦點、鍵盤無障礙等問題。CButton 重繪:過度工程,維護成本高。針對「啟動/停止」切換需求,方案一(文字切換)最輕量且符合使用者習慣;若專案強制要求按鈕外觀有明顯按下/彈起視覺差異,可採用方案二的 Push-like Checkbox。