スクロールされたことを知る.NET Framework 2.0以降の場合.NET Framework 2.0からはScrollableControl.Scrollイベントが追加されましたので、これを使って知ることができます。 以下の例は、フォームにスクロールバーがあるときに、スクロールを感知するものです。 'フォームの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が同じ値になるようです。
.NET Framework 1.1以前の場合リッチテキストボックスなどでは、HScroll、VScrollイベントによりスクロールされたことを知ることができますが、このようなイベントがあるコントロールは少ないです。 それ以外のコントロールでは、WndProcメソッドをオーバーライドし、WM_HSCROLL及び、WM_VSCROLLウィンドウズメッセージが送られてくることを待つことにより、スクロールされたかを判断できます。 次の例はAutoScrollプロパティをTrueにしたフォーム内のクラスに記述し、スクロールを感知するものです。
<System.Security.Permissions.SecurityPermission( _
System.Security.Permissions.SecurityAction.LinkDemand, _
Flags:=System.Security.Permissions.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
[System.Security.Permissions.SecurityPermission(
System.Security.Permissions.SecurityAction.LinkDemand,
Flags = System.Security.Permissions.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);
}
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
|
|
Copyright(C) DOBON!. All rights reserved.
|