基本的に、あなたが間違っていたのは、CreateGraphicsメソッドを使用することでした。
これは、行う必要があるとしてもめったに行わないことです。もちろん、メソッドが壊れているわけではありません。それはまさにそれが言うことをします: それはするように文書化されています:Graphicsフォームの描画面を表すオブジェクトを返します.
問題は、フォームが再描画されるたびに (多くの理由で発生する可能性があります)、Graphicsオブジェクトが基本的にresetになることです。その結果、あなたが手に入れたものにあなたが描いたものはすべて消去されます.
フォームは最初に読み込まれるときに常に再描画されるため、イベント ハンドラー メソッドでCreateGraphics neverを使用しても意味がありません。Loadまた、最小化して復元したり、別のウィンドウに隠れたり、サイズを変更したりするたびに再描画されます(これらのいくつかは、オペレーティング システム、グラフィックス ドライバー、およびフォームのプロパティに依存しますが、それは要点を超えています)。
使用できるのは、再描画後も保持されるべきではないフィードバックをユーザーに即座CreateGraphicsに表示する場合のみです。たとえば、イベントのハンドラーで、ドラッグ アンド ドロップのフィードバックを表示する場合。MouseMove
それで、解決策は何ですか?常にイベント ハンドラー メソッド内で描画を行ってください。Paintそうすれば、「再描画」には基本的にPaintイベントの発生が含まれるため、再描画後も持続します。
イベントが発生すると、描画できるオブジェクトを含むクラスPaintのインスタンスがハンドラーに渡されます。PaintEventArgsGraphics
したがって、コードは次のようになります。
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。これは、派生クラスでイベントを処理するためのベスト プラクティスと見なされます。ただし、どちらの方法でも機能します。)