ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# スペースキー+マウスドラッグでスクロールを制御する1

フォーム上に配置したPictureBoxに大きな画像を読み込んだ際に、PictureBox内でスペースキーを押しっぱなしにしている間、マウスドラッグでスクロールバーを制御できるようにするための準備についてメモしておきたいと思います。

まずはPctureBoxで画像を表示した際に、画像が大きい場合にスクロールバーが表示されるようにします。
PictureBoxにスクロールバーが存在しないため、Panelを利用する必要があります。
具体的には以下のように設定。

・フォームにPictureBoxの親となるPanelを配置
 PictureBoxを表示したい位置/サイズにして AutoScroll を True にする
・Panel内にPictureBoxを配置
 SizeMode を AutoSize にする

次に、ボタンを押すとフォーカスがボタンに移り、スペースキーを押すとボタンが反応してしまう挙動を解消する必要があります。
この方法については前回の記事をご覧ください。

ではスペースキーを押した際にPictureBox内でのみマウスカーソルが手のひらアイコンになるようにします。
丁度システムカーソルに手のひら状態が存在するので、そちらを利用します。
具体的な方法はdobon.netさんの記事を参考にさせていただきました。
システムカーソルを取得する - .NET Tips (VB.NET,C#...)

ちなみに最初、「PictureBox1_Mouse_Enter」と「PictureBox1_Mouse_Leave」のイベントでカーソルのアイコンを変えようとしていましたがなぜかうまくいきませんでした。
そこで Form1 の KeyPreview を True にしてキーイベントをフォームが受け取るようにし、「Form1_KeyDown」と「Form1_KeyUp」で pictureBox1 のカーソルが変化するように指定することでうまくいきました。
KeyPreviewについてはこちらの記事で解説されています。
KeyPressなどのキーイベントをすべてフォームが受け取るようにする - .NET Tips (VB.NET,C#...)


実行してみると、うまく動作しています!
f:id:moko_03_25:20200314204844g:plain

ソースコードは下記のような感じです。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sample_NoFocusedButton
{
	public partial class Form1 : Form
	{
		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;
			}
		}

		// スペースキーを離した時
		private void Form1_KeyUp(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Space)
			{
				pictureBox1.Cursor = Cursors.Default;
			}
		}
	}
}


続きはこちら!
effect.hatenablog.com