WS_EX_COMPOSITED フラグを指定して作成したウィンドウのリサイズ後、Windows 8 でのみ表示が不正となる

現象
Visual C++ で作成されたアプリケーションで、WS_EX_COMPOSITED フラグを指定してウィンドウを作成した場合、下記の処理を行うと、Windows 8 ではウィンドウの表示が不正となります。例えば、ウィンドウの再表示が行われない、ウィンドウが半透明となるといった現象が発生します。

1. WS_EX_COMPOSITED フラグを指定し、CreateWindowEX でウィンドウを作成します。

2. MoveWindow 関数、または手動で、ウィンドウ サイズを変更します。

3. ShowWindow 関数の引数に、SW_HIDE を指定し、実行します。

4. ShowWindow 関数の引数 に、SW_SHOW を指定し、実行します。
原因
Windows 8 では、WS_EX_COMPOSITED フラグを指定した場合において、描画処理の要否の判断を行う処理に問題があるために発生しています。
回避策
以下のいずれかの方法にて、現象の回避が可能となります。 

1.    本現象は、WS_EX_COMPOSITED フラグを設定していることにより発生してるため、WS_EX_COMPOSITED フラグを一旦はずし、再度付与することにより、現象が回避できます。

プログラム例

SetWindowLong( hWnd, GWL_EXSTYLE, 0 );SetWindowLong( hWnd, GWL_EXSTYLE, WS_EX_COMPOSITED );


2.本現象は、ウィンドウ サイズの変更に起因して発生しているため、画面の表示を行う ShowWindow 関数呼び出し後に、再度ウィンドウ サイズを変更することにより、現象が回避できます。

プログラム例
RECT WinRect;GetWindowRect(hWnd, &WinRect); MoveWindow(hWnd, WinRect.left, WinRect.top, WinRect.right-WinRect.left+1, WinRect.bottom-WinRect.top+1, TRUE);MoveWindow(hWnd, WinRect.left, WinRect.top, WinRect.right-WinRect.left, WinRect.bottom-WinRect.top, TRUE);



状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2848883 - 最終更新日: 09/29/2016 14:56:00 - リビジョン: 3.0

Windows 8

  • kbtshoot kbnofix kbexpertiseinter KB2848883
フィードバック