ステータスバーのラベルと進行状況の制御を更新してユーザーにフィードバックを提供する、長時間実行されるタスクを開始するボタンクリックイベントがあります。タスクを別のスレッドに移動する前に、ステータスラベル{label.text="somemessage";に気づきました。}(一般的に)はすぐに更新されますが、プログレスバーと一部のカスタムコントロールは、関数が終了してメインUIスレッドがメッセージの送信を再開するまで更新されないことがよくあります(メインUIスレッドを考慮すると理にかなっています)。
しかし、これは私たちに疑問を投げかけます-一部のウィンドウコントロールは、WM_Paintメッセージを発行する代わりに直接再描画しますか?
1 に答える
あなたの発見は、私が.NETコントロールについて知っていることとはかなり矛盾しています。一般的なルールは、Textプロパティを変更したり、ForeColorやBackColorなどのプロパティを変更したりすると、Invalidate()メソッドが呼び出されるだけです。これにより、UIスレッドがメッセージのポンピングを再開したときに、最終的にWM_PAINTメッセージが配信されます。コントロールまたはフォームのUpdate()メソッドを呼び出して、スローコードを入力する前に保留中のペイントを強制的に実行することができます。これはすべて完全に標準的なWindowsの動作です。
特別な場合は、ProgressBarコントロールです。そのためのネイティブWindows実装は、バーの長さを直接更新します。これは互換性のある動作です。このコントロールは、適切にポンピングされないコードでよく使用されます。
TextBoxには特別なペイント動作があり、WM_PAINTメッセージハンドラーを経由せずに、部分的にウィンドウに直接ペイントします。これは、386SUXマシンで適切に動作する必要があったWindows2からのレガシー動作です。しかし、この場合、それは関係ありません。
もちろん、これについて悩むのではなく、これが重要な場所に身を置くことは絶対にしないでください。