目的
実現したい課題は表題そのものです
ここでの着目点は「横スクロール」です
バックグラウンド
C#
でPictureBox
に表示した画像にスクロールバーを付け足したい、と云う要望に関しては、dobonさんのサイト(いつもお世話になっております…)
でそのものズバリのスマートな回答が スクロールバーを付けて画像を表示する として纏まっています
スクロールバーが出るので、マウスホイールも使えはするのですが、残念ながら縦スクロールしかできません
何とかせねばっ!
スクロールバー連携のおさらい
ちょっと重要なので、軽く対応方法を振り返っておきます
1.Panel
を置く
AutoScroll
プロパティをtrue
にする
2.その上にPictureBox
を置く
Location
プロパティは(0, 0)
にする
SizeMode
プロパティはAutoSize
にする
Dock
プロパティはNone
で(ここ重要)
3.PictureBox
のImage
プロパティに表示したい画像を放り込む
Panel
のサイズに収まらなければ、勝手にスクロールバーが出る(Panel
側に)
…では、ホイールでの縦横スクロールについて説明していきましょう
対応方法
まずはホイール回した際のイベントを拾わなければ話は始まりません
これは以下…
public Form1() {
InitializeComponent();
pictureBox1.MouseWheel += PictureBox1_MouseWheel; // <== これを追加
}
なんでか知らんがMouseWheel
イベントは[Browsable(false)]
で、プロパティウィンドウのイベントリスト内に出てこない為、しょうがないから手で追加します
で、ハンドラの中身は以下です
private void PictureBox1_MouseWheel(object sender, MouseEventArgs e) {
if (Control.ModifierKeys.HasFlag(Keys.Shift))
panel1.AutoScrollPosition = new Point(panel1.HorizontalScroll.Value - e.Delta, panel1.VerticalScroll.Value);
else
panel1.AutoScrollPosition = new Point(panel1.HorizontalScroll.Value, panel1.VerticalScroll.Value - e.Delta);
((HandledMouseEventArgs)e).Handled = true;
}
解説すると———
-
MouseWheel
ハンドラに流れてきたときに、Shift
キーが押されていればPoint.X
の方・押されていなければPoint.Y
の方、をDelta
で調整してあげる - スクロール処理しちゃったので
Handled
をtrue
にして、もうこれ以上余計な事はしないでくれ! と申し伝える
ここでの重要ポイントは、MouseWheel
イベントを捕まえるのはPictureBox
の方で、そのイベントハンドラの中ではPanel
のプロパティを触っている、と云う処でしょうか…
Panel
のMouseWheel
イベントを捕まえた段階では、もう既にスクロール処理が終わってしまっている様で上手くいきません
ここで、おさらいしたPanel
とPictureBox
の関係が生きてきます
PictureBox
はPanel
の上に乗っているので先にPictureBox
で捕まえて独自のスクロール処理を施した上でHandled
にtrue
をセットする事により、その裏にあるPanel
は「もう自分の出番はないな」とMouseWheel
のイベント処理はスキップしてくれる、というカラクリです
〆
これで自作のアプリでも、Excel
(Micoroft365の方)やGIMP
などの様にホイール使っての縦横スクロールが実現でき………
と、ここにきて、ふと心配になりました
私のパソコンってホイールの回転、逆向き仕様です
Delta
の調整って設定によらないよね?
「いやー、んなこたねーだろ」と思いながらも———
あ、大丈夫みたいです
さすがにそんな事は無かったという事で…