Winform Control.Refresh - 同期保証?

WinFormsの呼び出し Control.Refresh メソッドMSDNには次のように記述されています。

コントロールがクライアント領域を無効にし、すぐに自身と子コントロールを再描画します。

私は、接続されたディスプレイがControl.OnPaint呼び出しを生成していないと思われるControl.Refreshが現れるスキャンアウト信号(効果的な解像度の変更)を切り替えるときに発生するように見える断続的な問題をデバッグしています。私は詳細情報を得るためにアプリケーションを装備していますが、ディスプレイが一時的に空白になったことを検出したため、OnPaintを呼び出さないようにするランタイムになるかどうか不思議です。

これは私にはありそうもないようですが、私は他の煙煙銃を見つけることを期待していますが、他の誰かがこれを野生で見たオフチャンスを投稿しています。

1

1 答え

いいえ、保証されていません。コントロールに描画する画面がない場合は、描画メッセージは表示されません。

しかし、コントロールが再度画面に表示されると、ペイントメッセージが再び表示されます。

デバッグ情報をペイントしようとしていますか?コントロールが画面に表示されていない場合、リフレッシュを呼び出すと何が起こると思われますか?

1
追加された
@holtavolt私は確かにそれを試みたが、タイマーは、コントロールがオフスクリーンの場合、ペイントイベントとは何も変わらない。 OnMove、確かに、ペイントはしません。
追加された 著者 LarsTech,
@holtavoltはい、それはOnPaintを起動しません。何をしようとしているのか、おそらく塗装イベントにロジックを入れてはいけません。
追加された 著者 LarsTech,
@holtavoltあなたのテスト目的のために、私はあなたが "戻る"フォームを画面に移動する必要があるとは思わない。私の変更は次のとおりです: pastebin.com/qkw9gcvH
追加された 著者 LarsTech,
ありがとうございます - これを試して検証するためにいくつかの実験を考案しましたが、私には矛盾した結果が出ました。私は、OnMoveがコンソールに書き込む単純なフォームを作成し、Refreshを起動します。あなたが書いているように、フォームが画面上にある間、私はリフレッシュ(そしてその後のOnPaint)の火を見る。オフスクリーン(左上の移動キーと矢印キーを使用)を移動すると、フォームの一部が画面上に再び表示されるまで、リフレッシュは停止します。ただし、Timerを作成してフォームの場所を変更して画面の左側にスクロールすると、OnMove/OnPaintイベントを受け取る を行います。
追加された 著者 holtavolt,
OnMoveでRefresh()を実行していますか?コントロールがオフスクリーンであっても、OnPaintを起動させます。
追加された 著者 holtavolt,
私たちは何を変えていますか?これは常にOnPaintを起動しています: pastebin.com/Jc6hnVef - 私はペイントイベントロジックに同意します。
追加された 著者 holtavolt,
根本原因は、コマンドパターンの実装で深いフレームワークの問題であることが判明しました。ペイントが保証されていない最初の回答は正しいものであり、そのようにマーキングされています。
追加された 著者 holtavolt,