- PR -

PictureBox描画時の不思議

1
投稿者投稿内容
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-23 12:35
Windowsフォーム上のPictureBoxに描画するアプリを書いているのですが、
同じフォーム上に貼り付けたButtonの領域が描画されないという現象があり
問題を簡単にして調べてみると次のような違いがありました。
case 1) PictureBoxに直接FillRectangle()などのメソッドで描画した場合は問題なし。
case 2) 別のBitmapのイメージなどをpb.Imageにセットして表示させると発生する。
何かヒントをご存知の方がいらっしゃれば教えていただきたいのですが。

このPictureBoxとButtonの配置ですが、2つのPanelを使って次のような構造で
配置してあります。
Form
{
Panel1
{
PictureBox1
Button1
}
Panel2
{
Button2
}
}
ここで、Buttonの領域が描画されない問題はButton2でのみ発生するのです。
正確には、起動直後や他のフォームの影から最上位に出たときにその領域だけが
描画されず、フォームの伸縮やボタンのクリックでInvalidate()などが発生すると
その領域も一度は表示されます。
PictureBoxに描画するためのPaintイベントの中でブレークポイントを置いて
待っていると、case 2)の場合にだけは描画が終わってもひっきりなしに次のイベントが
発生して入ってきて、これが原因で別のPanel上にあるButton2の再描画処理が
実行されない、というように見えます。
描画イベント発生時の処理のコードは次のようなものです。

private void pictureBox1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
ShowMyImage(); // <- case 2
//ShowAnotherImage(e); // <- case 1
}
private Bitmap MyImage ;
public void ShowMyImage()
{
if (MyImage != null) MyImage.Dispose();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
MyImage = new Bitmap("K:\\pict1.jpg");
pictureBox1.Image = (Image) MyImage ;
}
public void ShowAnotherImage(System.Windows.Forms.PaintEventArgs e)
{
System.Drawing.Graphics g = e.Graphics;
SolidBrush brush = new SolidBrush(Color.Yellow);
g.FillRectangle(brush, 10, 10, 100, 100);
}

なぜ用もないのにPaintイベントが発生しつづけるのか、また、それが原因で
Panel2のButtonの描画がされないままになる理由があるのか、といったあたりが
わかれば対策のしようもあるとは思うのですが。

環境は、Win2000(SP4), VS.NET 2003/Enterprise, C#, Windowsアプリです。
よろしくお願いします。
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-23 18:19
自己レスです。
.NET TIPSの「ダブル・バッファリングにより描画を行うには?」の解説により解決しました。
お騒がせいたしました。
1

スキルアップ/キャリアアップ(JOB@IT)