1. ホーム
  2. .net

[解決済み] VB.NETで線を引く方法

2022-02-17 07:11:20

質問

VB.NETで簡単な線を描こうとしています。

私のコードは以下の通りですが、このコードを実行すると、フォームだけが表示されます! 線がありません。

何がいけなかったのでしょうか?

Public Class Form1
  Dim pen As System.Drawing.Graphics
  Private Sub Form1_Load(ByVal sender As System.Object,
                         ByVal e As System.EventArgs) Handles MyBase.Load
    pen = Me.CreateGraphics()
    pen.DrawLine(Pens.Azure, 10, 10, 20, 20)
  End Sub       
End Class

解決方法は?

基本的に、あなたが間違ったことをしたのは CreateGraphics メソッドを使用します。

これは、ほとんど、必要ないことです。もちろん、このメソッドが壊れているわけではありません。このメソッドは書いてあるとおりのことをします:ドキュメントに書いてあるとおりに Graphics オブジェクトはフォームの描画面を表します。

問題は、フォームが再描画されるたびに(様々な理由で起こり得ます)、そのフォームに含まれる Graphics オブジェクトは基本的に リセット . その結果、取得したものに描き込んだものはすべて消去されます。

形とは 常に は、最初にロードされたときに再描画されます。 CreateGraphics 決して の中で意味を持つ。 Load イベントハンドラーメソッド また、最小化および復元されたとき、他のウィンドウに覆われたとき、あるいはサイズが変更されたときにも再描画されることになります。 <サブ (これらのいくつかは、オペレーティングシステム、グラフィックドライバ、フォームのプロパティに依存しますが、それは要点から外れています) .

を使う可能性があるのは CreateGraphics を表示する場合です。 即時 というユーザーへのフィードバック はいけません。 は再描画の間持続する。例えば MouseMove イベントにおいて、ドラッグ・アンド・ドロップのフィードバックを表示する場合。

では、どのような解決策があるのでしょうか。 描画は常に Paint イベントハンドラーメソッド そうすれば、再描画の際にも持続します。 Paint イベントが発生します。

このとき Paint イベントが発生すると、ハンドラには PaintEventArgs クラスがあり、その中には Graphics オブジェクトに描画することができます。

では、あなたのコードはどうなっているかというと が必要です。 のようになります。

Public Class Form1

    Protected Overridable Sub OnPaint(e As PaintEventArgs)
        ' Call the base class
        MyBase.OnPaint(e)

        ' Do your painting
        e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
    End Sub

End Class

(なお、上記のコードでは OnPaint メソッドを処理するのではなく、対応する Paint イベントが発生します。これは、派生クラスでイベントを処理する際のベストプラクティスと考えられています。しかし、どちらの方法でも動作します)。