如何在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。例如:
单击项目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_BEGINSCROLL
或LVN_ENDSCROLL
通知。 (它们也是鼠标滚轮滚动的原因。)
虽然这仍然无法解决用户使用键盘上下移动焦点列表项时发生的滚动。
以上是关于如何在CListCtrl中捕获滚动事件?的主要内容,如果未能解决你的问题,请参考以下文章