【C#】【Form】スクロール に関するあれこれ

■ 独自スクロールバーを実装するには...

 * 以下の関連記事を参照。
HScrollBar / VScrollBar ~ 独自スクロールバーの実装 ~
https://blogs.yahoo.co.jp/dk521123/38010582.html

■ 画像にスクロールを付ける

手順

[1] Panelを画像の親コントロールとして配置する
 + AutoScrollプロパティ : True

[2] PictureBoxをPanelの子として配置する
 + SizeModeプロパティ : AutoSize
 + 親とドッキングしないこと(★ここでドッキングして、ハマった★)

# 以下の関連記事を参照のこと
PictureBox [11] ~ スクロールバー付きの画像表示を考える ~
https://blogs.yahoo.co.jp/dk521123/38109343.html

参考文献

http://www.atmarkit.co.jp/fdotnet/dotnettips/698scrollpic/scrollpic.html
http://codepanic.itigo.jp/cs/picturebox_scroll.html

■ スクロール位置を制御するには...

 * AutoScrollPositionプロパティを使う

サンプル

this.AutoScrollPosition =
    new Point(-this.AutoScrollPosition.X + 10, -this.AutoScrollPosition.Y + 10);

補足:その他のサンプル

 * 以下の関連記事を参照。
PictureBox [2] ~ PictureBox を マウスで移動する ~
https://blogs.yahoo.co.jp/dk521123/37861699.html

■ マウスホイルによるスクロールを無効化する

 * 通常、スクロール近くでマウスホイルを行えば、スクロールするがそれを無効化する

対応案

[1] マウスホイルイベントを受ける子コントローラに対して、マウスホイールイベントを追加する
 => 追加方法については、以下の関連記事を参照のこと

★
ただし、この方法では完全には、無効にはならない
(例:スクロールバー上でマウスホイールを行った場合)
マウスホイールイベントの追加方法
https://blogs.yahoo.co.jp/dk521123/37867491.html
[2] [1] のイベント内で「handledMouseEventArgs.Handled = true;」を行う(以下「サンプル」参照)

サンプル

必要箇所を抜粋
public Form1()
{
   InitializeComponent();
   pictureBox1.MouseWheel += new MouseEventHandler(OnMouseWheel);
}

private void OnMouseWheel(object sender, EventArgs e)
{
   var handledMouseEventArgs = e as HandledMouseEventArgs;
   handledMouseEventArgs.Handled = true;
}

参考文献

https://social.msdn.microsoft.com/Forums/en-US/fca391b4-ccbf-4389-9203-8229905308c4/how-to-disable-mouse-wheel-scroll?forum=winforms

■ スクロール連動する

 * 複数スクロールがあった場合、スクロールバーを動かしたら、
   他のスクロールバーも連動して動くようにする

サンプル

private void OnScroll(object sender, ScrollEventArgs scrollEventArgs)
{
  Panel targetPanel = (Panel) sender;

  int x = targetPanel.HorizontalScroll.Value;
  int y = targetPanel.VerticalScroll.Value;

  panel1.AutoScrollPosition = new Point(x, y);
  panel2.AutoScrollPosition = new Point(x, y);
}
* プロパティの設定
 * Panelを画像の親コントロールとして配置する
 + AutoScrollプロパティ : True
* イベントの設定
 * 後は、Panel のプロパティにあるイベント「Scroll」に
   上記のメソッド「OnScroll」を設定する。

追記:マウスホイルの対応

以下、コード抜粋
public Form1()  
{  
  InitializeComponent();

  //ホイールイベントの追加  
  this.panel1.MouseWheel   
    += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel);
  this.panel2.MouseWheel   
    += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel);
}

private void OnScroll(object sender, MouseEventArgs mouseEventArgs)
{
  Panel targetPanel = (Panel) sender;

  int x = targetPanel.HorizontalScroll.Value;
  int y = targetPanel.VerticalScroll.Value;

  panel1.AutoScrollPosition = new Point(x, y);
  panel2.AutoScrollPosition = new Point(x, y);
}


関連記事

Windows Form

Windows Form ~ 目次 ~
https://blogs.yahoo.co.jp/dk521123/8054245.html
HScrollBar / VScrollBar ~ 独自スクロールバーの実装 ~
https://blogs.yahoo.co.jp/dk521123/38010582.html
マウスホイールイベントの追加方法
https://blogs.yahoo.co.jp/dk521123/37867491.html

Windows Form / PictureBox

PictureBox [1] ~画像を表示する~
https://blogs.yahoo.co.jp/dk521123/23504075.html
PictureBox [2] ~ PictureBox を マウスで移動する ~
https://blogs.yahoo.co.jp/dk521123/37861699.html
PictureBox [11] ~ スクロールバー付きの画像表示を考える ~
https://blogs.yahoo.co.jp/dk521123/38109343.html