C#_Paint のタイミングメモ

図形CSV (x, y, w, h のデータ) を読み込み pictureBox に表示した画像に図形を描きたかったが、
意外と時間がかかった。

結論から。Paint イベントに書く

 

※ Paint イベントをデザインのプロパティから済。

    private void pictureBox_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawEllipse(Pens.Red, xData, yData, width, height);
    }

xData などは円のデータ。複数あるなら for 文で回す。
円の x と y は 左上の座標。

 

経緯

1 ) Drag & Drop で円や四角を pictureBox に描くコード作成。( Paint イベント設置 )
2 ) 描いたデータを保存。
3 ) 描いたデータを読み込んで pictureBox に表示。

3 ) でつまった。

 

書いたコードは、
Paint イベントが呼ばれる前に pictureBox に 画像 をセットして
円を描いていた ( using (Graphics g = pictureBox.CreateGraphics()) を使って )

 

しかし、Debug で挙動を見ると
pictureBox.Image = 画像 」の時点では、
pictureBox に 画像 は出ず、大きさだけ確保したもよう。
  AutoScroll True にしてるので、画像の大きさ分のスクロールが出現。

using (Graphics g = ~ のソースでは、
pictureBox ( 画像は表示されていない灰色の部分 ) に図形が描かれた。

この後、Paint イベントをソース上で呼んでいないにも関わらず、
Paint イベント pictureBoxMain_Paint へ処理が移った

そして、 Paint イベントを終えると pictBox に 画像が表示されたが、
描いていた図形は消えていた。上書きされた?

 

Paint pictureBox の Image に変更があると呼ばれるようなので、
図形描きのコードを Paint イベントに書いた。
Paint イベントは再描画とあるがよく分かってない。

 

こちらから。
https://dobon.net/vb/dotnet/graphics/creategraphics.html
https://dobon.net/vb/dotnet/graphics/drawrectangle.html

以上。