マウスホイールによるスクロール

C#

パネル領域でスクロールが発生する場合につまずいたのでメモ

  • フォーカスが入ったらスクロール対象とする
  • マウスホイールの1刻みを1ページスクロールにする
  • スクロールバーの▲▼は1行スクロールにする

多分もっと、簡単なやり方があるはず。

using System;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
            // パネル領域にマウスカーソルが入った場合のハンドラを登録
            this.panelA.MouseEnter += new EventHandler(this.panelA_MouseEnter);
            this.panelB.MouseEnter += new EventHandler(this.panelB_MouseEnter);

            // パネル領域でマウスホイールを操作した場合のハンドラを登録
            this.panelA.MouseWheel += new MouseEventHandler(this.panelA_MouseWheel);
            this.panelB.MouseWheel += new MouseEventHandler(this.panelB_MouseWheel);
            
            // スクロールの▲▼押下時のスクロール量
            this.panelA.VerticalScroll.SmallChange = 29;
            this.panelB.VerticalScroll.SmallChange = 29;
            // スクロールバー押下時のスクロール量 
            this.panelA.VerticalScroll.LargeChange = 87;
            this.panelB.VerticalScroll.LargeChange = 87;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            panelA.AutoScroll = true;
            panelB.AutoScroll = true;

            // ボタンを100個作って、スクロール領域を発生させる
            for (int i = 0; i <= 100; i++)
            {
                Button buttonA = new Button();
                Button buttonB = new Button();
                buttonA.Text = "A"+i.ToString();
                buttonB.Text = "B"+i.ToString();
                this.panelA.Controls.Add(buttonA);
                this.panelB.Controls.Add(buttonB);
            }
        }

        //  パネル領域にマウスカーソルが入った場合
        private void panelA_MouseEnter(object sender, EventArgs e)
        {
            // パネルAにフォーカス
            this.panelA.Focus();
        }

        private void panelB_MouseEnter(object sender, EventArgs e)
        {
            // パネルBにフォーカス
            this.panelB.Focus();
        }

        // パネルA領域でマウスホイールを操作した場合
        private void panelA_MouseWheel(object sender, MouseEventArgs e)
        {
            if (e.Delta < 0)
            {
                // 下にスクロール時
                if (this.panelA.VerticalScroll.Value + e.Delta * -1 < this.panelA.VerticalScroll.Maximum)
                {
                    this.panelA.VerticalScroll.Value = this.panelA.VerticalScroll.Value + e.Delta + this.panelA.VerticalScroll.LargeChange;
                }
                else
                {
                    this.panelA.VerticalScroll.Value = this.panelA.VerticalScroll.Maximum;
                }
            }
            else
            {
                // 上にスクロール時
                if (this.panelA.VerticalScroll.Value + e.Delta * -1 > this.panelA.VerticalScroll.Minimum)
                {
                    this.panelA.VerticalScroll.Value = this.panelA.VerticalScroll.Value + e.Delta - this.panelA.VerticalScroll.LargeChange;
                }
                else
                {
                    this.panelA.VerticalScroll.Value = this.panelA.VerticalScroll.Minimum;
                }
                
            }
        }

        // パネルB領域でマウスホイールを操作した場合
        private void panelB_MouseWheel(object sender, MouseEventArgs e)
        {
            if (e.Delta < 0)
            {
                // 下にスクロール時
                if (this.panelB.VerticalScroll.Value + e.Delta * -1 < this.panelB.VerticalScroll.Maximum)
                {
                    this.panelB.VerticalScroll.Value = this.panelB.VerticalScroll.Value + e.Delta + this.panelB.VerticalScroll.LargeChange;
                }
                else
                {
                    this.panelB.VerticalScroll.Value = this.panelB.VerticalScroll.Maximum;
                }
            }
            else
            {
                // 上にスクロール時
                if (this.panelB.VerticalScroll.Value + e.Delta * -1 > this.panelB.VerticalScroll.Minimum)
                {
                    this.panelB.VerticalScroll.Value = this.panelB.VerticalScroll.Value + e.Delta - this.panelB.VerticalScroll.LargeChange;
                }
                else
                {
                    this.panelB.VerticalScroll.Value = this.panelB.VerticalScroll.Minimum;
                }

            }
        }

    }
}