OnPaint
効率的に使用するには、いくつかのことを知っておく必要があります。
- コントロールの
OnPaint
、たとえば の はForm1
、コントロールがペイントされるたびに実行されます (当然...)
- の子コントロールが描画されるたび
OnPaint
に、Form1
が実行されます。たとえば、 に 150 個の子コントロールがあるときに、ofを使用して右上隅にドットを描画すると、ドットは少なくとも 150 回描画されます。レンダリング時間が大幅に増加します。特に、 で多くのカスタム ドローイングと計算を行う場合。
Form1
Form1
OnPaint
Form1
Form1
OnPaint
OnPaint
そのため、原則として、コントロールに 1 つ以上の子コントロールがある場合、そのコントロールにロジックを含めてはなりません。代わりに、ペイント ジョブを実行する子コントロールを保持しないカスタム コントロールを作成する必要があります。そして、カスタム描画が必要な場所にある親コントロールの子コントロールとして配置します。
- コントロールが親に追加されるたびに、親が再描画されます。チェックボックスがオンになっている大きな結果セットなど、別のコントロールに多数のコントロールを配置する場合は
Form1
、使用する必要がありますForm1.SuspendLayout()
(参照: http://msdn.microsoft.com/en-us/library/system.windows.forms.control. suspendlayout.aspx ) 子コントロールを追加する前に。そしてForm1.ResumeLayout()
、コントロールの追加が完了したら。これにより、イベントが一時的に抑制され、OnPaint
レンダリング時間が短縮されます。
- 透明度は常にレンダリング時間を増加させます。
- 間に背景がないようにコンポーネントを配置すると
OnPaint
、親コントロールのイベント数が減少します。たとえば、4 つのテキストボックスを互いに接するように配置します。そのため、それらの間に背景はなく、コントロールはすべてOnPaint
4 つのイベントではなく1 つのイベントで描画されOnPaint
ます。もちろん、すべてのコンポーネントを並べて接着したくないため、これが常に可能であるとは限りません。ただし、パフォーマンスが見た目よりも重要である場合、たとえば、ある種の大規模なカスタム「データグリッド」などでは、実行する価値があります。
- イベント内のコントロールの位置やサイズを変更しないでください。
OnPaint
これにより新しいイベントが呼び出されOnPaint
ます。コントロールを再配置/サイズ変更する必要がある場合は、OnPaint
が呼び出される前に、コード内の別の場所に追加する必要があります。たとえば、または類似のイベントに再配置/サイズ変更コードを配置しOnLayout
ますOnResize
。OnPaint
アプリケーションが機能するためには、再配置/サイズ変更コードをイベントに配置する必要があるとまだ考えている場合は、間違っているので、コードのロジックを修正する必要があります。
- 独自のクラス外のコントロールで Refresh() を呼び出す前に、System.Math.Pow(2, 2) 回考えてください。Refresh を呼び出す衝動に駆られた場合は、おそらく、表示しようとしているものと同期を保つために、新しいイベントとイベント ハンドラーが必要になるでしょう。Invalidate() の場合も同様です。
- 効率的に描画しているかどうかを確認するには、次の手順を実行します。1. アプリケーションを開きます。 2. 最上位の親の OnPaint にブレーキ ポイントを置きます。 3. ウィンドウを最大化してアプリケーションをカバーします。4. ウィンドウを再度最小化すると、アプリケーションはコントロールごとに再描画します。二重に描かれている場合は、アプリケーションのロジックに誤りがあります。
そうですね、忘れてしまったことがあれば、この Q&A を更新します。何かを忘れたり、間違えたりした場合は、喜んでメモしてください。
少し前にこの情報を探していたので、これが.Netでカスタムペイントを使用する上で有利なスタートを切ることを願っています.