如何在CListCtrl中捕获滚动事件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在CListCtrl中捕获滚动事件?相关的知识,希望对你有一定的参考价值。

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

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

messagemap:

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。例如:

partialy visible item

单击项目9会导致ClistCtrl滚动一点,以便项目完全可见。

答案

messagemap:

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);
}
另一答案

鼠标滚轮滚动触发器OnMouseWheel。

另一答案

更好的解决方案是使用发送到父窗口的LVN_BEGINSCROLLLVN_ENDSCROLL通知。 (它们也是鼠标滚轮滚动的原因。)

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

以上是关于如何在CListCtrl中捕获滚动事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止显示 CListCtrl 的底部滚动条?

如何使用 CListCtrl 就地编辑列?

如何在滚动视图中设置谷歌地图片段

Flex - 如何显示可滚动文本并捕获单击/焦点事件以允许添加新文本?

如何捕获 v-data-table 组件上的滚动事件?

在 CListCtrl 中控制宽度/布局(图标视图)