tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 何とか解決できたと思います。
投稿日: 2008/10/20(Mon) 16:50
投稿者魔界の仮面弁士
できましたね、おめでとうございます。

が。あともう一歩。


> Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
>   Dim g As Graphics = Me.CreateGraphics
>   g.DrawLine(Pens.Red, startX, startY, e.X, e.Y)
> End Sub

これはマズイです。Graphics の後始末が行われていませんので。

『作成した Graphics の使用後は、それを作成元が責任を持って破棄せねばならない』
という仕様になっているため、実際には上記は、

 Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
  Using g As Graphics = Me.CreateGraphics
   g.DrawLine(Pens.Red, startX, startY, e.X, e.Y)
  End Using
 End Sub
のように記述する必要があります。
(Using ブロックを使うことで、使用後に破棄されるようになります)


それから、CreateGraphics に描画した内容というのは、別のフォームが重なったり、
フォームを最小化したりすると容易に消えてしまうため、あまり推奨できる描画方法では
ありません。(これは VB6 でいえば、AutoRedraw = False の状態だと思ってください)

一度描いた線を継続的に表示しておきたい場合には、No.8317 にて回答したように
描画処理を「Paint イベント」の e.Graphics にて行うようにすれば OK です。
(この点は、VB6 の Paint イベントの仕組みと同様です)
なお Paint イベントの e.Graphics は、自分で『作成』したものではないため、こちらは
Using 等による「破棄」を行う必要が無い(破棄してはいけない)点に注意してください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。