2

WTL8.1を使用して開発されたWindowsXPSP3用のVS2008C++アプリケーションがあります。私のアプリケーションには、アプリケーションの境界線のサイズが変更されたときにちらつくタブコントロールが含まれています。

私のウィンドウ階層は次のようになります。

CFrameWindowImpl   CMainFrm
|-CSplitterWindow  Splitter
  |-CTabView       Configuration Tabs
  | |-CDialogImpl  Configuration View 1
  | |-CDialogImpl  Configuration View 2
  | |-CDialogImpl  Configuration View 3
  |-CDialogImpl    Control View

私が試している解決策は、CFrameWindowImpl派生クラスにWS_EX_COMPOSITEDスタイルを使用させ、その下のすべてのウィンドウにスタイルを使用させることWS_EX_TRANSPARENTです。残念ながら、これにより、タブコントロールボタンが空の黒いバーとして表示され、構成ビューのコントロールがまったく表示されなくなります。

WS_EX_COMPOSITEDWS_EX_TRANSPARENTスタイルを削除すると、フォームは正しく表示されますが、CTabViewサイズを変更すると、その下のすべてがひどくちらつきます。

ちらつきをなくし、コントロールを適切に描画するには、何を変更する必要がありますか?

ありがとう、PaulH


編集:動作しました。WS_EX_TRANSPARENTMarkRansomの提案に従ってすべてのスタイルを削除しました。(内に含まれる)のみWS_EX_COMPOSITEDスタイルを配置します。他のコントロールは、必要に応じてを介してダブルバッファリングを取得します。CTabCtrlCTabViewWTL::CDoubleBufferImpl<>

4

3 に答える 3

3

ウィンドウは、描画される前に消去されるため、ちらつきます。これを排除するには、ウィンドウの消去を完全に無効にし、ダブルバッファリングを使用する必要があります。ウィンドウの内容をビットマップに描画してから、ビットマップをウィンドウにコピーします。ビットマップには背景を含むコンテンツ全体が含まれているため、消去する必要はありません。

WS_EX_COMPOSITEDがダブルバッファリングを自動的に処理するように見えますが、それでもおそらくNULLバックグラウンドブラシを使用するか、WM_ERASEBKGNDメッセージを処理する必要があります。

于 2010-11-15T20:07:09.483 に答える
3

MSDNで言及されていないのは、デスクトップウィンドウマネージャー(Windows Vistaおよび7でウィンドウペイントをフックして、Aero Glass効果を取得するために必要なデスクトップ合成を実行するコンポーネント)がWS_EX_COMPOSITEDを実装していないことです。

つまり、このスタイルをXPで機能させるために費やしたすべての作業は、Vista以降では無意味になる運命にあります。

WS_EX_COMPOSITEDのもう1つの問題、およびそれがオプションのスタイルであり、XPのデフォルトではない理由:ダブルバッファリングは、親ウィンドウのBeginPaint/EndPaintブロック中に実行されたペイントのみを取得します。多くの標準コントロールでさえ、WM_PAINTハンドラーの外部でペイントを実行し、その結果、バックバッファーは部分的にしかペイントされません。

残念ながら、結果として、ネイティブAPIアプリのちらつきを「排除」する唯一の方法は、ちらつきを最小限に抑えることです。WS_CLIPCHILDRENとWS_CLIPSIBLINGSは、重複するコントロールがない場合に役立ちます。つまり、各コントロールの領域が1回だけペイントされるようにします。また、メインダイアログがWM_ERASEBKGNDでフラッドフィルを実行しないことを確認してください

于 2010-11-15T20:27:05.957 に答える
0

私の経験では、子コントロールを含むものにダブルバッファリングを使用することはできません(ほとんどの場合、WM_PRINTを完全にサポートしている場合を除きます)。

于 2010-11-15T20:30:49.537 に答える