You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分OnVScroll消息来自CSpinButtonCtrl还是垂直滚动条?

区分OnVScroll消息来源:CSpinButtonCtrl vs 垂直滚动条

针对你的场景——多个CSpinButtonCtrl且无法通过ID区分,这里有两种可靠的方法来判断OnVScroll的消息来源:

方法1:检查窗口类名(最通用,不依赖MFC runtime)

Windows的CSpinButtonCtrl对应的原生窗口类名是msctls_updown32,我们可以通过GetClassName获取控件的类名来判断:

void CMyFormView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    if (pScrollBar != nullptr)
    {
        TCHAR szClass[256] = { 0 };
        ::GetClassName(pScrollBar->m_hWnd, szClass, _countof(szClass));
        
        if (_tcscmp(szClass, _T("msctls_updown32")) == 0)
        {
            // 消息来自CSpinButtonCtrl,执行你的Spin控件处理逻辑
            // 比如:CSpinButtonCtrl* pSpin = static_cast<CSpinButtonCtrl*>(pScrollBar);
        }
        else
        {
            // 消息来自普通垂直滚动条,调用基类处理
            CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
        }
    }
    else
    {
        // 无关联控件的默认情况,按滚动条处理
        CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
}

方法2:利用MFC的Runtime Class判断(更符合MFC风格)

如果你的CSpinButtonCtrl都是用MFC封装的对象,可以用IsKindOf方法直接判断类型:

void CMyFormView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    CWnd* pWnd = reinterpret_cast<CWnd*>(pScrollBar);
    if (pWnd != nullptr && pWnd->IsKindOf(RUNTIME_CLASS(CSpinButtonCtrl)))
    {
        // 确认是CSpinButtonCtrl发送的消息
        CSpinButtonCtrl* pSpin = static_cast<CSpinButtonCtrl*>(pWnd);
        // 在这里处理Spin控件的滚动逻辑
    }
    else
    {
        // 交给基类处理普通滚动条的消息
        CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
}

注意事项

  • 方法1的优势是不依赖MFC的对象封装,即使控件是直接通过API创建的也能生效;
  • 方法2需要确保控件是通过MFC的CSpinButtonCtrl类创建并绑定的,否则IsKindOf会返回false;
  • 两种方法都不需要依赖控件ID,完美适配你“Spin控件数量众多”的场景。

内容的提问来源于stack exchange,提问作者Alpha_33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:27:58