【C#】FormにDockしたPictureBoxのリサイズ時のサイズ取得

タイトルが長ったらしくなってしまったのですが、ピクチャボックスをFormにDockしたときにピクチャボックスのリサイズイベントでピクチャボックスの大きさ(幅、高さ)を取得するときのお話です。

 

 

フォームエディタで、上図の様にPictureBoxをFormにDockして、リサイズイベントでピクチャボックスのサイズを取得するには

private void pictureBox1_Resize(object sender, EventArgs e) 
{ 
	System.Diagnostics.Debug.WriteLine( 
		pictureBox1.Width.ToString() + ", " + pictureBox1.Height.ToString() 
	); 
}

とすれば、特に問題なくピクチャボックスの幅と高さを拾う事ができ、出力ウィンドウには

 

631, 460
632, 461
633, 462
634, 463
635, 464
636, 464
637, 465
638, 465
640, 466
640, 467

 

のように表示されます。

 

ここで、リサイズイベント内でピクチャボックスのImageプロパティを変更するプログラム

private void pictureBox1_Resize(object sender, EventArgs e) 
{ 
	System.Diagnostics.Debug.WriteLine( 
		pictureBox1.Width.ToString() + ", " + pictureBox1.Height.ToString() 
	); 
	pictureBox1.Image = null; 
} 

を実行すると、

 

683, 483
302, 260
685, 484
302, 260
686, 484
302, 260
687, 485
302, 260
688, 486
302, 260

 

のように表示され、 pictureBox1.Image = null; のコードが呼ばれた時点でリサイズイベントが再度発生し、取得したサイズが元のサイズに戻ってしまいます。

 

これを回避するのに、ここ↓

 

PictureBox リサイズイベントでのコントロールサイズを取得

https://social.msdn.microsoft.com/Forums/ja-JP/e554eb73-1437-4f63-baec-8f922d190211/picturebox-?forum=csharpgeneralja

 

を参考に sender からPictureBoxを拾うように

private void pictureBox1_Resize(object sender, EventArgs e) 
{ 
	var picBox = sender as PictureBox; 
	System.Diagnostics.Debug.WriteLine( 
		picBox.Width.ToString() + ", " + picBox.Height.ToString() 
	); 
	picBox.Image = null; 
}

としても結果は変わらず。

 

そこで、今回の条件としては、ピクチャボックスをフォームにDockしているので、ピクチャボックスのリサイズイベントが発生するときは、フォームのリサイズイベントも発生するということで、フォームのリサイズイベントで、ピクチャボックスのサイズを拾うように

private void Form1_Resize(object sender, EventArgs e) 
{ 
	System.Diagnostics.Debug.WriteLine( 
		pictureBox1.Width.ToString() + ", " + pictureBox1.Height.ToString() 
	); 
	pictureBox1.Image = null; 
}

としたら、出力ウィンドウにも

 

631, 460
632, 461
633, 462
634, 463
635, 464
636, 464
637, 465
638, 465
640, 466
640, 467

 

のように表示され、正しく動いてくれました。

 

なぜ、このような動きになるのか?不明ですが、結果オーライということで。。

 

C#へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください