【问题标题】:How to catch a scroll event in a CListCtrl?如何在 CListCtrl 中捕获滚动事件?
【发布时间】:2009-09-21 21:21:23
【问题描述】:

我将 CListCtrl 子类化到我自己的类中,并在多个对话框和视图中使用它。我想要做的是在垂直滚动 ClistCtrl 时执行一些代码。我需要它在 CListCtrl 子类本身中。

我可以通过demoncodemonkey提供的方法检测到与滚动条交互时触发的滚动:

消息图:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_WM_VSCROLL()
END_MESSAGE_MAP()

方法声明:

class CMyListCtrl : public CListCtrl
{
    //...
protected:
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    DECLARE_MESSAGE_MAP()
};

方法实现:

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    //do some stuff here
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

但是:

  • 鼠标滚轮滚动不会触发 OnVScroll。

  • 自动滚动发生 当 CListCtrl 项目部分 单击底部可见的(它 向上滚动,所以项目是 完全可见)没有触发 OnVScroll 要么。例如:

单击第 9 项会使 ClistCtrl 滚动一点,使该项完全可见。

【问题讨论】:

    标签: c++ mfc scroll clistctrl


    【解决方案1】:

    消息图:

    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
        ON_WM_VSCROLL()
    END_MESSAGE_MAP()
    

    方法声明:

    class CMyListCtrl : public CListCtrl
    {
        //...
    protected:
        afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
        DECLARE_MESSAGE_MAP()
    };
    

    方法实现:

    void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        //do some stuff here
        CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    

    【讨论】:

    • 这对于检测滚动条滚动非常有用,鼠标滚轮被忽略,并且当点击底部部分可见的 CListCtrl 项目时发生的自动滚动(它被向上滚动,因此完全可见)被忽略也。我正在编辑我的原始问题以包含这个部分答案。谢谢!
    • 我同意你的观点,即在这种情况下不会调用 WM_VSCROLL,但是如果我写的内容回答了你原来的问题,那么你应该接受我的回答,然后再问一个不同的问题。跨度>
    【解决方案2】:

    鼠标滚轮滚动触发 OnMouseWheel。

    【讨论】:

    • OnMouseWheel 在父对话框中触发。如果我没记错的话,ON_NOTIFY_REFLECT 可以解决这个问题,但我没有完整的例子。
    • OnMouseWheel 已在派生类中触发。我已成功将 ON_WM_MOUSEWHEEL 添加到我的消息映射并实现了“BOOL OnMouseWheel(UINT fFlags, short zDelta, CPoint point)”。
    【解决方案3】:

    更好的解决方案是使用发送到父窗口的LVN_BEGINSCROLL 或LVN_ENDSCROLL 通知。 (它们还考虑了鼠标滚轮滚动。)

    虽然这仍然不能解决用户使用键盘上下移动焦点列表项时发生的滚动问题。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多