パネル領域でスクロールが発生する場合につまずいたのでメモ
- フォーカスが入ったらスクロール対象とする
- マウスホイールの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; } } } } }