ListView mit Scroll-Events
Frank Dzaebel, erstellt am: 12.1.2006, zuletzt geändert: 17.3.2006
Kategorie: ListView, .NET-Version: 1.1, [Download]
Einige Windows.Forms-Controls haben keine Scroll-Ereignisse unter .NET.
Man kann diese aber nachrüsten, indem man zunächst das normale Control (hier ListView) nutzt. Dann können die Vorkommen von "System.Windows.Forms.ListView" durch "ScrollListView" ersetzt werden. Schliesslich können die Events "HScrollChanged" / "VScrollChanged" ganz normal über das Eigenschaften-Fenster benutzt werden.
public class ScrollListView : ListView
{
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
private const int SB_HORIZONT= 0x0;
private const int SB_VERTICAL= 0x1;
int wParam;
/// <summary> Tritt auf, wenn die horizontale Scroll-Position geändert wurde.</summary>
[Description("Tritt auf, wenn die horizontale Scroll-Position geändert wurde.")]
public event ScrollEventHandler HScrollChanged;
/// <summary> Tritt auf, wenn die vertikale Scroll-Position geändert wurde.</summary>
[Description("Tritt auf, wenn die vertikale Scroll-Position geändert wurde.")]
public event ScrollEventHandler VScrollChanged;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_HSCROLL: wParam = m.WParam.ToInt32();
if (HScrollChanged == null) return;
HScrollChanged(this, new ScrollEventArgs(EventType(LOWORD(wParam)),
GetScrollPos(this.Handle, SB_HORIZONT))); break;
case WM_VSCROLL: wParam = m.WParam.ToInt32();
if (VScrollChanged == null) return;
VScrollChanged(this, new ScrollEventArgs(EventType(LOWORD(wParam)),
GetScrollPos(this.Handle, SB_VERTICAL))); break;
}
}
public static int HIWORD(int n){return ((n>>0x10) & 0xffff);}
public static int LOWORD(int n){return (n & 0xffff);}
[DllImport("user32.dll")] // using System.Runtime.InteropServices;
static public extern int GetScrollPos(System.IntPtr hWnd, int nBar);
private ScrollEventType EventType(int wParam)
{
if (wParam < Enum.GetValues(typeof(ScrollEventType)).Length)
return (ScrollEventType)wParam;
else return ScrollEventType.EndScroll;
}
}
Zum Test kann man eine normale ListView über die ToolBox in die Form ziehen
und dann alle Vorkommen (also normal 2) von "System.Windows.Forms.ListView"
durch "ScrollListView" ersetzen.