リッチテキストボックスの場合は、水平方向のスクロールをHScrollイベントで、垂直方向のスクロールをVScrollイベントで知ることができます。
'RichTextBox1のHScrollイベントハンドラ Private Sub RichTextBox1_HScroll(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles RichTextBox1.HScroll Console.WriteLine("水平方向にスクロールされました") End Sub 'RichTextBox1のVScrollイベントハンドラ Private Sub RichTextBox1_VScroll(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles RichTextBox1.VScroll Console.WriteLine("垂直方向にスクロールされました") End Sub
//RichTextBox1のHScrollイベントハンドラ private void RichTextBox1_HScroll(object sender, EventArgs e) { Console.WriteLine("水平方向にスクロールされました"); } //RichTextBox1のVScrollイベントハンドラ private void RichTextBox1_VScroll(object sender, EventArgs e) { Console.WriteLine("垂直方向にスクロールされました"); }
フォームやPanelのようにScrollableControlクラスを継承したコントロールであれば、ScrollableControl.Scrollイベントを使って知ることができます。このイベントは、.NET Framework 2.0以降で使用できます。
以下の例は、フォームにスクロールバーがあるときに、スクロールを感知するものです。
'フォームのScrollイベントハンドラ Private Sub Form1_Scroll(ByVal sender As Object, _ ByVal e As ScrollEventArgs) Handles MyBase.Scroll If e.ScrollOrientation = ScrollOrientation.VerticalScroll Then Console.WriteLine("垂直方向に{0}スクロールされました", _ e.NewValue - e.OldValue) Else If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then Console.WriteLine("水平方向に{0}スクロールされました", _ e.NewValue - e.OldValue) End If End If End Sub
//フォームのScrollイベントハンドラ private void Form1_Scroll(object sender, ScrollEventArgs e) { if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) { Console.WriteLine("垂直方向に{0}スクロールされました", e.NewValue - e.OldValue); } else if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) { Console.WriteLine("水平方向に{0}スクロールされました", e.NewValue - e.OldValue); } }
補足:上記のコードを実行するとわかりますが、e.NewValueとe.OldValueが同じ値になるときがあります。スクロールバーをつかんだときと、離したときは、e.NewValueとe.OldValueが同じ値になるようです。
上記以外の場合は、WndProcメソッドをオーバーライドし、WM_HSCROLL及び、WM_VSCROLLウィンドウズメッセージが送られてくることを待つことにより、スクロールされたかを判断できます。
次の例はAutoScrollプロパティをTrueにしたフォーム内のクラスに記述し、スクロールを感知するものです。
'Imports System.Security.Permissions <SecurityPermission(SecurityAction.Demand, _ Flags:=SecurityPermissionFlag.UnmanagedCode)> _ Protected Overrides Sub WndProc(ByRef m As Message) Const WM_HSCROLL As Integer = &H114 Const WM_VSCROLL As Integer = &H115 Select Case m.Msg Case WM_HSCROLL Console.WriteLine("水平スクロールバーがスクロールされました。") Case WM_VSCROLL Console.WriteLine("垂直スクロールバーがスクロールされました。") End Select MyBase.WndProc(m) End Sub
//using System.Security.Permissions; [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] protected override void WndProc(ref Message m) { const int WM_HSCROLL = 0x114; const int WM_VSCROLL = 0x115; switch (m.Msg) { case WM_HSCROLL: Console.WriteLine( "水平スクロールバーがスクロールされました。"); break; case WM_VSCROLL: Console.WriteLine( "垂直スクロールバーがスクロールされました。"); break; } base.WndProc(ref m); }