PictureBoxに直線を描こうとしても表示されない


シンディ  2009-03-04 21:15:39  No: 141625  IP: 192.*.*.*

画面に直線(最終的には矢印なども書きたい)を入れたいため、以下のページの内容を参考に、
PictureBoxに直線を描こうとしています。

http://dobon.net/vb/dotnet/graphics/drawline.html

そこで、サンプルを参考にし、フォームロードのイベントに以下のようなコードを入れてみました。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'Graphicsオブジェクトの作成
    Dim g As Graphics = PictureBox1.CreateGraphics()
    '(0,0)-(100,100)に、幅1の黒い線を引く
    g.DrawLine(Pens.Black, 0, 0, 100, 100)
    'リソースを開放する
    g.Dispose()
End Sub

しかし、さっぱり直線は表示されません。
試しに、ボタンクリックのイベントで上記コードを書くとちゃんと直線が表示されます。
また、フォームを最小化して、再びフォームを表示させると、描かれた直線がまた消えてしまいます。
そこでですが、
・PictureBoxに直線を描画された状態でフォームを表示させるには?
・フォームを再度表示させた時にPictureBoxに直線を描画されたままにするには?
について教えていただけないでしょうか?
宜しくお願いします。

編集 削除
シンディ  2009-03-04 21:24:58  No: 141626  IP: 192.*.*.*

ちなみにバージョンはVB2008です。
宜しくお願いします。

編集 削除
太郎冠者  2009-03-04 22:53:51  No: 141627  IP: 192.*.*.*

Paintイベント内で描画しましょう。

編集 削除
まずは  2009-03-04 23:26:32  No: 141628  IP: 192.*.*.*

以前同様質問があったときの回答方法で回避できます。

   Dim b As New Bitmap( _
     Me.PictureBox1.Width, Me.PictureBox1.Height)
   Dim g As Graphics = Graphics.FromImage(b)
   Me.PictureBox1.Image = b

   '(0,0)-(100,100)に、幅1の黒い線を引く
   g.DrawLine(Pens.Black, 0, 0, 100, 100)
   'リソースを開放する
   g.Dispose()

.CreateGraphics() があまりよくないようですね。

編集 削除
特攻隊長まるるう  2009-03-06 09:22:13  No: 141629  IP: 192.*.*.*

>CreateGraphics() があまりよくないようですね。
よくないってどういう意味でしょう?
よくないんならボタンクリックでもPaintイベントでも
良くないということに?
再描画されてるのを理解してないだけでは?
フォームロード時は画面は表示されていないのですから
そこで命令すること自体が間違いです。

対策としては
・再描画のたびに自前のコードで描画する。
もしくは
・PictureBox に画像を覚えてもらって再描画してもらう。
となり、既に回答された内容になります。
回答内容がよくないという指摘なら理由も書込むように
お願いします。

編集 削除
まずは  2009-03-06 10:45:27  No: 141630  IP: 192.*.*.*

>よくないってどういう意味でしょう?

今回の場合は、
CreateしてDisposeしているからです。

編集 削除