2011-12-14 8 views
0

独自のヘッダーセットを持つカスタムコントロールを構築しています。親コントロールの再ペイントが子コントロールの再ペイントの前で行をジャンプするのを止めるにはどうすればよいですか?

上記のカスタムコントロールの子コントロールとしてヘッダー(別のカスタムコントロール)が存在します。

ヘッダー(子コントロールの一部)のサイズを変更すると、子contolはInvalidate()を呼び出して再描画するようにメッセージをキューに入れます。

子contolが無効化された後、親コントロールにヘッダーのサイズが変更されたことが通知され、独自のInvalidate()コマンドが発行されます。

これはこのトレースによって示されている:

Headers.Invalidate()
List.Invalidate()
Headers.Invalidate()
List.Invalidate()

しかし再ペイントを開始する時間が来ると、親コントロールは最初にペイントイベントを受け取り、次にヘッダーコントロールを受け取ります。

List.Paint
Headers.Paint

私は急速にマウスを移動すると、マウス移動イベントがペイントイベントの前にキューイングされているように見えるので、無効化が呼ばれるように続けますが、親コントロールのペイントイベントは常に最初の火災:

List.Paint
List.Paint
List.Paint
List.Paint
Headers.Paint
List.Paint
List.Paint
Headers.Paint

これは実質的にリスト遅れするヘッダ制御を引き起こします。理想的には、両方のペイントイベントが同時に発生し、すべてのマウス移動イベントがペイントイベントの前にキューイングされます(ペイントは常に同期されますが、マウスイベントはすべてペイントの間にフラッシュされます)。

私はこの問題をどこから修正するか。

私のヘッダーが経験する遅れをどこから修正するのですか?

+0

Windowsペインティングオーダーは常にZオーダーで、変更することはできません。 Windowsメッセージの順序は常に最初に入力され、最後にペイントされ、変更できません。マウスを移動してもペイントイベントは発生しません。遅い塗料の標準的な理由は、あまりにも多くのコントロールを使用しているためです。 –

+0

@HansPassant、ありがとう、私は試行錯誤でこれを学んできました。しかし、私は列のサイズを変更するので、マウスを動かすとペイントが発生します。 –

答えて

0

既にダブルバッファリングを使用していますか? 遅いかもしれませんが、更新が発生したときに両方が更新されるように、再ペイントを同期する必要があります。

あなたがしてフォームにダブルバッファリングに切り替えることができます。また、あなたがしようとする場合があります

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
    SetStyle(ControlStyles.Opaque, true); 
    SetStyle(ControlStyles.SupportsTransparentBackColor, false); 
+0

私はすでにダブルバッファリングを使用していますが、問題は親コントロールの 'OnPaint'がより頻繁に呼び出されることです。 –

1

答えは使用して、手動で描くことにより、再描画の同期を行うことですUpdateまたはRefreshの方法。

Updateメソッドは、コントロールとすべての子を同期して再描画するだけです。

Refreshメソッドは、コントロールとすべての子を無効にし、Updateを呼び出します。

関連する問題