3

コントロールの外観をカスタマイズする必要がある場合があります。または、カスタムペイントをたくさん行います。私はそうできることを知っていますOnPaint(参照:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx

を使用して .net アプリケーションでカスタム ペイントを行う正しい方法は何OnPaintですか? アプリケーションを最適化し、レンダリング時間を最小限に抑えるために、覚えておく必要のあるルールはありますか?

注: 私は OnPaint の非効率的な使い方を時々見たり経験したりしたので、この Q&A を作成しました。

4

1 に答える 1

11

OnPaint効率的に使用するには、いくつかのことを知っておく必要があります。

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

そうですね、忘れてしまったことがあれば、この Q&A を更新します。何かを忘れたり、間違えたりした場合は、喜んでメモしてください。

少し前にこの情報を探していたので、これが.Netでカスタムペイントを使用する上で有利なスタートを切ることを願っています.

于 2012-11-30T20:20:26.010 に答える