DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

スクロールされたことを知る

.NET Framework 2.0以降の場合

.NET Framework 2.0からはScrollableControl.Scrollイベントが追加されましたので、これを使って知ることができます。

以下の例は、フォームにスクロールバーがあるときに、スクロールを感知するものです。

VB.NET
コードを隠すコードを選択
'フォームの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
C#
コードを隠すコードを選択
//フォームの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にしたフォーム内のクラスに記述し、スクロールを感知するものです。

VB.NET
コードを隠すコードを選択
<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
C#
コードを隠すコードを選択
[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);
}
  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2010/6/30 WndProcにSecurityPermissionAttributeを付けた。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。