0

次のウィンドウ階層を持つアプリケーションがあります。

W1
  -W2  (Child of W1)
    - W3 ( Child of W2)

--------------------|
| W1|------------|  |
|   |W2 |------| |  |
|   |   |W3    | |  |
|   |   |------| |  |
|   |------------|  | 
|-------------------|

W2 で特定のイベントが発生すると、次のように呼び出しますUpdateWindow

W2::onCertainEvent()
{
        Invalidate(NULL);
        UpdateWindow();
}

W2のOnPaint処理は次のようになります。

   W2::onPaint()
  {
    //W2 logic goes here
    W3.Invalidate(NULL); //So that paint messages are given to W3
  }

しかし、W2 でペイント メッセージが失われることがあります。UpdateWindow呼び出されますが、呼び出される対応するOnPaint()はありません。

プロパティを W1 (W2 の親) に追加するとWS_EX_TRANSPARENT、常にペイント メッセージが W2 で受信されます。

しかし、WS_EX_TRANSPARENTフラグを追加する際の問題は、ウィンドウ W1 のサイズを変更すると、多くのちらつきが発生することです。

私の質問は次のとおりです。 1. ペイント メッセージが失われる W2 の何が問題なのですか? 2.追加WS_EX_TRANSPARENTするとペイントの問題が解決する理由。3. フラグが使用されている場合、ちらつきの問題を解決するにはどうすればよいですか。

ありがとう、

4

2 に答える 2

2

WM_PAINT "メッセージ" は、通常の意味でのメッセージではありません。これらは、各ウィンドウのメッセージ キューの最後にあるフラグのように動作します。それらはスレッド メッセージ キューを通過せず、Windows メッセージ キューに位置を持ちません。これらは、Windows メッセージ キューからメッセージを取得しようとしたときに生成され、他にメッセージはありません。その時点で、さまざまな無効化がすべて考慮され、1 つ以上 (!) の WM_PAINT が生成されます。

その結果W2::onCertainEvent()、「ウィンドウ無効」フラグが設定された後に設定されます。最終的WM_PAINTに呼び出されることになりますが、そのときに生成される WM_PAINT は、その「特定のイベント」専用ではありません。

歴史的な背景として、保留中のメッセージがたくさんある場合、ウィンドウの描画にあまり時間をかけたくないということがあります。これは、とにかくウィンドウを無効にするだけだからです。最初にモデルを最新の状態にしてから、ビューを実行することをお勧めします。

于 2010-02-05T16:06:20.497 に答える
2

ちらつきちらつきは、処理して何もしないことを確認すること
で解決できます。WM_ERASEBKGNDちらつきが発生するのは、すべてのペイントの前に各 Window がこのメッセージを処理して、背景色を使用して無効な領域を消去するためです。それを処理して何もしない場合、消去は行われません。WM_PAINTハンドラーが無効化された領域全体をペイントしていることを確認してください。そうしないと、前のペイントからのアーティファクトが残されます。

ただし、この場合、ちらつきが発生するのは、W1 が最初に自分自身をペイントし、次に W2 がペイントされ、次に W3 が各ペイントにペイントされるためだと思います。これは、発生している問題を解決する方法ではないことを示唆してWS_EX_TRANSPARENTいます。

WM_PAINT
の欠落 これを追跡する方法を知るのは困難です。.NET では、これは、子ウィンドウがコントロールのクライアント領域全体を覆い隠し、ペイント メッセージが伝達されないために発生しますが、これは特定の .NET 動作であると考えています。問題を示すサンプル プロジェクトまたはサンプル コードを提供していただけると、大きな助けになります。

当面は、W2 が隠れないように W3 を削除して、すべてのペイント メッセージが返されるかどうかを確認してください。CWnd::Invalidateまた、オプションとして NULL を使用せず、BOOL(TRUEまたは) を使用することに注意してくださいFALSE

于 2010-02-05T14:01:51.453 に答える