2012-03-28 108 views
1

我想为ListView中的滚动制作事件。如何为ListView制作滚动事件

我发现了一些可以使用的东西,但它只在使用滚动条时触发事件。它不响应鼠标滚轮或箭头滚动。

private const int WM_HSCROLL = 0x114; 
private const int WM_VSCROLL = 0x115; 

public event EventHandler Scroll; 

protected void OnScroll() 
{ 
    if (this.Scroll != null) 
     this.Scroll(this, EventArgs.Empty); 
} 

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    base.WndProc(ref m); 
    if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL) 
     this.OnScroll(); 
} 

需要用什么常量来触发鼠标滚轮和键盘上/下按钮的滚动事件?

回答

5

鼠标滚轮m.Msg值应为:

private const int WM_MOUSEWHEEL = 0x020A; 
+0

非常感谢你 – AnasBakez 2012-03-28 14:55:47

+0

我已经找到了用于在向下箭头键和键盘上的结束键上进行滚动的其他常量。 – AnasBakez 2012-04-01 11:41:42

+2

太好了。真是个奇迹。 – anhtv13 2016-03-03 08:45:07

1

我发现其他常量用于制造上的向下箭头键并在keyboard.this结束键的滚动是用于CustomListView

代码
using System; 
using System.Windows.Forms; 

class MyListView : ListView 
{ 
    public event ScrollEventHandler Scroll; 
    private const int WM_HSCROLL = 0x114; 
    private const int WM_VSCROLL = 0x115; 
    private const int MOUSEWHEEL = 0x020A; 
    private const int KEYDOWN = 0x0100; 

    protected virtual void OnScroll(ScrollEventArgs e) 
    { 
     ScrollEventHandler handler = this.Scroll; 
     if (handler != null) handler(this, e); 
    } 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == MOUSEWHEEL || m.Msg == WM_VSCROLL || (m.Msg == KEYDOWN && (m.WParam == (IntPtr)40 || m.WParam == (IntPtr)35))) 
     { 
      // Trap WM_VSCROLL 
      OnScroll(new ScrollEventArgs((ScrollEventType)(m.WParam.ToInt32() & 0xffff), 0)); 
     } 
    } 
}