1

我将 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 滚动一点,以便项目完全可见。

4

3 回答 3

5

消息映射:

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);
}
于 2009-09-21T21:59:19.470 回答
3

鼠标滚轮滚动触发 OnMouseWheel。

于 2009-10-25T15:26:14.147 回答
0

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

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

于 2019-02-01T10:37:19.503 回答