2017-10-15 16 views
0

デスクトップコンポジションを無効にすると、タブ上にマウスを置くたびに点滅/点滅します。これは、デスクトップコンポジションが無効になっている場合にのみ発生します。私はWM_ERASEBKGNDメッセージを取り消そうとしましたが、問題を解決しません。この問題の解決策は何ですか?デスクトップコンポジションを無効にすると、タブコントロールのフリッカーが発生する

これは、私がMASMタブコントロールに使用しようとした例です。

http://www.dreamincode.net/forums/index.php?app=core&module=attach&section=attach&attach_id=28600

ビンがすでにコンパイルされています。

編集:WS_EX_COMPOSITEDフラグを有効にし、listviewコントロールを追加した後、listviewのフレームは描画されません。これは、ListViewタイプがレポートに設定されている場合にのみ発生します。問題について

ピック:レポートとフレーム以外にリストビュータイプの変更 enter image description here

WS_EX_COMPOSITEDフラグが問題を修正しますが、ちらつきが戻って enter image description here

+0

いくつかのzipファイルをチェックするつもりはないでしょうし、それは多分どんなコードでもありますが、ちょうどマウスの移動や同様のイベントでウィンドウコンテンツを描画しますか?最初に背景を描き、その上にテキストを描くことで描いていますか?あなたが頻繁にそれをやっていて、スクリーン上に最終状態の画像を構成するためのオフスクリーンバッファがない場合、それは観察者に「点滅」します(描画ルーチンが非常に高速でVSYNCに対して同期しない限り、表示レイがそれらのピクセルに到達すると、ウィンドウはすでに描画されています)。 (イベントドリブンアプリとしてのVSYNC同期は不可能かもしれません) – Ped7g

+0

ウィンドウマネージャ自体がオフスクリーンテクスチャから最終イメージを作成するため、ウィンドウがそこから描画され、おそらくは「終了」している可能性があるため、いくつかの合理的なイベント(ウィンドウイベントを呼び出すことはできませんが、WM_DRAWのようなものはありませんでしたか?アプリケーションがイベントを取得し、オフスクリーンのバッファを再描画し、イベントを処理したことを報告し、コンポジタはそれを画面合成の入力として受け取ります。これはすべて私が十年を見たことのないOSの総称です。塩の穀物を取ってください。 – Ped7g

+0

これは単なるダイアログボックスベースのアプリケーションなので、描画は関係ありません。ダイアログボックステンプレートは、ダイアログボックスリソースタイプとして保存され、** DialogBoxParam ** APIを通じて呼び出されます。タブは、DialogBox ** WM_INITDIALOG **メッセージ〜** SendDlgItemMessage ** APIへの応答として作成されます –

答えて

2
が来るの除去 enter image description here

を描かれています

問題が修正されましたWS_EX_COMPOSITED th eダイアログボックス拡張スタイル。

EDIT:私の質問の編集のための 修正リストビューにSetParent関数を使用して、それが代わりにサブダイアログの親のように、メインウィンドウに添付することです。これでフレームが正しく表示されます。

は、だから私はこの1つは別のダイアログ上の問題

リストビューを持っていると思う - >CreateDialogParamを使用して(タブコントロールオーバー)メインダイアログに取り付けます。タブコントロール上のWS_EX_COMPOSITEDセット

結果: はXPの描画の問題があります。非常に鈍い。レポートタイプのリストビューの非表示フレーム。質問の編集に見られるように。

新しいメソッド 別のダイアログのリストビュー - >それをCreateDialogParamを使用してメインダイアログ(タブコントロール上)にアタッチします。 WS_EX_COMPOSITEDはタブコントロールとメインダイアログにも設定されています。 SetParentを呼び出すと、listviewがその親としてMainダイアログに関連付けられます。

結果: 非常に滑らかな描画です。 XPにも問題はありません。デスクトップ構成を無効にしても、ちらつきは全くありません。 WM_ERASEBKGNDをメインダイアログの既定値のままにし、カスタムなしWM_PRINTを処理します。しかし、WM_ERASEBKGND無効にするには、ダイアログボックスDialogProcで1を設定するだけです。

関連する問題