MFC 所有繼承自 CWnd 的控件(包括 CSliderCtrl)均支持 EnableWindow(BOOL bEnable) 方法:
// 啟用滑動條
m_slider.EnableWindow(TRUE);
// 禁用滑動條(灰色、不可交互、不接收消息)
m_slider.EnableWindow(FALSE);
通常在對話框初始化 (OnInitDialog)、某個業務邏輯判斷後、或響應其他控件事件(如 CheckBox 切換)中調用。
若需求是「用戶拖動滑塊後自動彈回原位(程序控制位置),但視覺上不灰化」,可重寫 OnHScroll 或處理 NM_RELEASEDCAPTURE 通知:
void CMyDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (pScrollBar->GetSafeHwnd() == m_slider.GetSafeHwnd())
{
if (!m_bSliderEnabled) // 業務標誌
{
// 強制恢復到程序設置的位置
m_slider.SetPos(m_nForcedPos);
return; // 不調用默認處理,阻止用戶拖動生效
}
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
或在 OnNotify 中處理 NM_RELEASEDCAPTURE:
BOOL CMyDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->hwndFrom == m_slider.GetSafeHwnd() && pNMHDR->code == NM_RELEASEDCAPTURE)
{
if (!m_bSliderEnabled)
{
m_slider.SetPos(m_nForcedPos);
*pResult = 0;
return TRUE;
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
EnableWindow(FALSE/TRUE),最簡單、符合 UI 規範(灰化提示不可用)。OnHScroll 或 NM_RELEASEDCAPTURE,強制 SetPos 回滾,實現「可見但不可用戶改變」。SetRange、SetTicFreq、SetPos 完成完整滑動條控制。