4

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
4

5 に答える 5

9

基本的に、あなたが間違っていたのは、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。これは、派生クラスでイベントを処理するためのベスト プラクティスと見なされます。ただし、どちらの方法でも機能します。)

于 2013-07-27T08:11:16.540 に答える
1

このコードをPaintフォームのイベントに配置する必要があります。ここで起こっているのは、線が描画されているということですが、読み込みが完了するとフォームが再描画されるため、線が消えます。また、黒またはより対照的な色を試してみてください。そうしないと、フォームのウィンドウの背景色に対して見落としてしまいます。

于 2013-07-27T08:09:07.543 に答える
0

これは、グループボックス コントロールをフォームに追加することで実現できます。次に、テキストを削除し (空白のテキストを保持)、Height を 1 に設定し、必要な BackColor を選択します。

于 2014-05-13T09:21:59.383 に答える