独自のヘッダーセットを持つカスタムコントロールを構築しています。親コントロールの再ペイントが子コントロールの再ペイントの前で行をジャンプするのを止めるにはどうすればよいですか?
上記のカスタムコントロールの子コントロールとしてヘッダー(別のカスタムコントロール)が存在します。
ヘッダー(子コントロールの一部)のサイズを変更すると、子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
これは実質的にリスト遅れするヘッダ制御を引き起こします。理想的には、両方のペイントイベントが同時に発生し、すべてのマウス移動イベントがペイントイベントの前にキューイングされます(ペイントは常に同期されますが、マウスイベントはすべてペイントの間にフラッシュされます)。
私はこの問題をどこから修正するか。
私のヘッダーが経験する遅れをどこから修正するのですか?
Windowsペインティングオーダーは常にZオーダーで、変更することはできません。 Windowsメッセージの順序は常に最初に入力され、最後にペイントされ、変更できません。マウスを移動してもペイントイベントは発生しません。遅い塗料の標準的な理由は、あまりにも多くのコントロールを使用しているためです。 –
@HansPassant、ありがとう、私は試行錯誤でこれを学んできました。しかし、私は列のサイズを変更するので、マウスを動かすとペイントが発生します。 –