画面上の800x800ピクセルの正方形に100個のセミランダムポイントの間に100個の線を描く必要があります。画面上に800 * 800ピクセルのボックスを効率的に描画する必要があります
私は組み込みdrawlines &のdrawrecangles関数を.NETの内部で使用していましたが、フォームがペイントするたびに描画が消去されます。
私はメモリ内のビットマップに描画することを考えていましたが、それが良い解決策であるかどうかはわかりません。
ヒント?
画面上の800x800ピクセルの正方形に100個のセミランダムポイントの間に100個の線を描く必要があります。画面上に800 * 800ピクセルのボックスを効率的に描画する必要があります
私は組み込みdrawlines &のdrawrecangles関数を.NETの内部で使用していましたが、フォームがペイントするたびに描画が消去されます。
私はメモリ内のビットマップに描画することを考えていましたが、それが良い解決策であるかどうかはわかりません。
ヒント?
これは良い考えであるだけでなく、名前(ダブルバッファリング)も持っています。フォームレベルのビットマップで描画し、フォームのPaintイベント(実際には、フォーム上のピクチャボックスでこれを行い、Paintイベントを使用する方が良いでしょう)では、GraphicsオブジェクトのDrawImageメソッドを使用して、ピクチャボックスへのビットマップ。
もっと簡単な方法は、ビットマップを作成して描画し、ピクチャボックスのImageプロパティとしてビットマップを設定することです。フォームが再描画されてもイメージは自動的に保持されます。
良いアイデアです。ビットマップに描画すると、ビットマップがフォームに描画されます。あなたのビットマップを修正した後、再描画(または同等のもの)を呼び出すだけです。
私のマシンのGDI +の性能が同等であると仮定して、それは良い考えではありません。 Formクラスは、既にDoubleBufferedプロパティを使用してダブルバッファリングをサポートしています。それはP/Invokeに浸ることはないと仮定した場合よりも優れた仕事をします。
私の測定:
もちろんこれはcですあなたが400本以上の線を引くときハンギングします。 WFのダブルバッファリングでは、BufferedGraphicsクラスを使用する必要があることがわかります。それは非常に不公平です。
ビットマップを描画して永続化したり、ペイントイベントを使用してフォームに描画することができます。
(この例では、画像ボックスPicture1の)ビットマップに描画するには、次の基本クラスでPrivate Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawRectangle(...)
end sub
BufferedGraphics間は非友好的であってもよい、this guy explains it well:
dim g as graphics
g = Graphics.FromImage(Picture1.Image)
g.DrawRectangle(...)
ペイントイベントを使用しますあなた自身のコントロールに使うことができます。