前回の記事の続きです。
effect.hatenablog.com
すでに事前準備ができているので、あとはスクロールバーの制御の部分を実装するだけです。
考え方としては、PictureBox の「MouseDown」「MouseMove」「MouseUp」のイベントでマウスドラッグを判定して、ドラッグ中にスペースキーを押している状態であればPanelのスクロールバーを動かすという感じです。
「MouseMove」はただマウスを動かしているだけの時も反応してしまうので「MouseDown」と「MouseUp」を組み合わせる必要が出ます。ここは少々不便な点ではあります。
具体的な記述方法についてはこちらの記事を参考にさせていただきました。
codepanic.itigo.jp
という訳で無事に動作しました!
ソ-スコードは以下のような感じです。
using System; using System.Drawing; using System.Windows.Forms; namespace Sample_NoFocusedButton { public partial class Form1 : Form { bool isDragging = false; bool downSpaceKey = false; Point posStart; public Form1() { InitializeComponent(); } // フォームロード時 private void Form1_Load(object sender, EventArgs e) { // サンプル画像を PictureBox に読み込む Bitmap b = new Bitmap(@"sample.png"); pictureBox1.Image = b; } // ボタンクリック時 private void Button1_Click(object sender, EventArgs e) { // ボタンを押した後にスペースキーでボタンをクリックさせない対処 ActiveControl = null; } // スペースキーを押した時 private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) { pictureBox1.Cursor = Cursors.Hand; downSpaceKey = true; } } // スペースキーを離した時 private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) { pictureBox1.Cursor = Cursors.Default; downSpaceKey = false; } } // マウスクリック時 private void PictureBox1_MouseDown(object sender, MouseEventArgs e) { isDragging = true; posStart = e.Location; } // マウスドラッグ時 private void PictureBox1_MouseMove(object sender, MouseEventArgs e) { if (isDragging && downSpaceKey) { Point pos = new Point( e.Location.X - posStart.X, e.Location.Y - posStart.Y); panel1.AutoScrollPosition = new Point( -panel1.AutoScrollPosition.X - pos.X, -panel1.AutoScrollPosition.Y - pos.Y); } } // マウスドラッグ終了時 private void PictureBox1_MouseUp(object sender, MouseEventArgs e) { isDragging = false; } } }