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

rec*_*rec 1 c++ mfc scroll clistctrl

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

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

messagemap:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_WM_VSCROLL()
END_MESSAGE_MAP()
Run Code Online (Sandbox Code Playgroud)

方法声明:

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

方法实现:

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

但:

  • 鼠标滚轮不会触发OnVScroll.

  • 当点击底部部分可见的CListCtrl项目(它向上滚动以使项目完全可见)时,自动滚动也不会触发OnVScroll.例如:

部分可见的项目http://i37.tinypic.com/2guxtfn.png

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

dem*_*key 5

messagemap:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_WM_VSCROLL()
END_MESSAGE_MAP()
Run Code Online (Sandbox Code Playgroud)

方法声明:

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

方法实现:

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

  • 我同意你的观点,WM_VSCROLL在这种情况下不会被调用,但是如果我写的内容回答了你原来的问题,那么你应该接受我的答案,然后再问一个不同的答案. (3认同)