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

时间:2009-09-21 21:21:24

标签: c++ mfc scroll 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滚动一点,以便项目完全可见。

3 个答案:

答案 0 :(得分:5)

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);
}

答案 1 :(得分:3)

鼠标滚轮滚动触发器OnMouseWheel。

答案 2 :(得分:0)

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

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