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

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

リッチテキストボックスの場合

リッチテキストボックスの場合は、水平方向のスクロールをHScrollイベントで、垂直方向のスクロールをVScrollイベントで知ることができます。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//RichTextBox1のHScrollイベントハンドラ
private void RichTextBox1_HScroll(object sender, EventArgs e)
{
    Console.WriteLine("水平方向にスクロールされました");
}

//RichTextBox1のVScrollイベントハンドラ
private void RichTextBox1_VScroll(object sender, EventArgs e)
{
    Console.WriteLine("垂直方向にスクロールされました");
}

.NET Framework 2.0以降で、ScrollableControl.Scrollイベントを使用する方法

フォームやPanelのようにScrollableControlクラスを継承したコントロールであれば、ScrollableControl.Scrollイベントを使って知ることができます。このイベントは、.NET Framework 2.0以降で使用できます。

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

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以前の場合

上記以外の場合は、WndProcメソッドをオーバーライドし、WM_HSCROLL及び、WM_VSCROLLウィンドウズメッセージが送られてくることを待つことにより、スクロールされたかを判断できます。

次の例はAutoScrollプロパティをTrueにしたフォーム内のクラスに記述し、スクロールを感知するものです。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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);
}
  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2010/6/30 WndProcにSecurityPermissionAttributeを付けた。
  • 2012/05/29 リッチテキストボックスのコードを追加。
  • 2013/12/9 SecurityAction.LinkDemandの代わりにSecurityAction.Demandを使うようにした。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。