简体   繁体   English

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

[英]How to catch a scroll event in a CListCtrl?

I subclassed CListCtrl into my own class, and I use it in several dialogs and views. 我将CListCtrl细分为自己的类,并在多个对话框和视图中使用它。 What I want to do is execute some code when the ClistCtrl is being scrolled vertically. 我想做的是在垂直滚动ClistCtrl时执行一些代码。 I need this to be in the CListCtrl subclass itself. 我需要它在CListCtrl子类本身中。

I can detect the scrolling triggered when interacting with the scrollbar with the method provided by demoncodemonkey: 我可以使用demoncodemonkey提供的方法检测与滚动条交互时触发的滚动:

messagemap: 讯息图:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_WM_VSCROLL()
END_MESSAGE_MAP()

method declaration: 方法声明:

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

method implementation: 方法实现:

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

But: 但:

  • Mousewheel scrolling does not trigger OnVScroll. 鼠标滚轮滚动不会触发OnVScroll。

  • The automatic scrolling happening when a CListCtrl item partially visible at the bottom is clicked (it is scrolled up so the item is entirely visible) did not trigger OnVScroll either. 单击底部的部分可见的CListCtrl项(将其向上滚动以使该项完全可见)时发生的自动滚动也不会触发OnVScroll。 For example: 例如:

部分可见项

Clicking on item 9 causes the ClistCtrl to scroll a little so the item is completely visible. 单击项目9会使ClistCtrl滚动一点,以便该项目完全可见。

messagemap: 讯息图:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_WM_VSCROLL()
END_MESSAGE_MAP()

method declaration: 方法声明:

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

method implementation: 方法实现:

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

鼠标滚轮触发OnMouseWheel。

A much better solution is to use LVN_BEGINSCROLL or LVN_ENDSCROLL notifications that are sent to the parent window. 更好的解决方案是使用发送到父窗口的LVN_BEGINSCROLLLVN_ENDSCROLL通知。 (They also account for mouse-wheel scrolling.) (它们还说明了鼠标滚轮滚动。)

Although that still doesn't solve the scrolling that occurs when a user moves the focused list item up and down using keyboard. 尽管这仍然不能解决用户使用键盘上下移动焦点列表项时发生的滚动。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM