解決済みの質問
いつもお世話になっております。
ふと、PictureBoxに描画をしてみようかと思い
Paintイベントに以下のようにして描画を行いました。
myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(myBitmap);
pictureBox1.Image = myBitmap;
・
・(g.FillRectangle(・・・);など)
・
(myBitmapはBitmap型のグローバル変数です。)
PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。
そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので
この処理を毎回通っています。
(その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。)
ところが、描画はうまくいったのですが、メッセージボックスを出すと
そのメッセージボックスが一度Altキーを押さないと表示されません。
色々調べて、ダブルバッファリングというものがあると知りました。
そこでPaintイベントで最初にこの処理をし
Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(image);
gに描画し終わってから
e.Graphics.DrawImage(image, 0, 0);
としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。
(あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・)
メッセージボックスが表示されないのは、PictureBoxの描画のため
他のコントロールの描画ができていなためだと推測しているのですが
どう直していいかわかりません。
どなたか、わかる方がいましたらよろしくお願いします。
<補足>
OS:Vista
VisualStudio2008
.NET Framework3.5
投稿日時 - 2009-11-20 17:26:28
メッセージボックスについては状況が再現できないので分かりませんが、ペイントイベントでビットマップを定義しているのはよろしくないですね。
myBitmapのサイズを定義する最適な場所はSizeChangedイベントです。なおかつ、既存のmyBitmapのサイズよりも変更後のサイズが小さくなったら、ビットマップを作り直す必要はありません。同じビットマップをクリアして使い回しすればいいだけです。これなら、ウィンドウが拡大されたときにしかビットマップの再形成がされなくなり、負荷はかなり減るはずです。
画像が静的なものであれば、SizeChangedイベント内でmyBitmapへの描画も完了してしまいます。あとはmyBitmapをPictureBox.Imageに割り当てておけば勝手に再描画されます。
参考書などでもグラフィックはPaintイベントで行う、という説明がよくあります。それは描画内容が少ない場合の話であって、内容が多い場合はバックバッファに描画し、Paintイベントではバックバッファの転写のみを行うようにしたほうがよいでしょう。
投稿日時 - 2009-11-21 01:46:14
お礼
回答ありがとうございます。
確かに、言われてみるとSizeChangeイベントでサイズを変更すればOKですね・・・
それに、PictureBoxのPaintイベントを呼んでも、結局はBitmapに描画してるのでPaintイベントを呼ぶ必要はありませんね;
別に描画メソッドを作り、必要な時だけ描画処理を呼ぶようにしてみたところ、メッセージボックス表示も解決しました。
バックバッファがまだよくやり方を理解できていないので
頑張ってやってみます。
ありがとうございました。
投稿日時 - 2009-11-25 11:54:40
0人が「このQ&Aが役に立った」と投票しています