2009-05-14 21 views
2

ピクセル単位のアルファチャンネルでビットマップを含む子コントロールを描画するとき、再描画が必要なときはいつでもちらつきが増えています。実際のブレンドは正しく機能しています。私はちらつきを減らすことに関する多くの情報(例えばthis questionまたはthis site)を見つけましたが、この状況に特に当てはまるものは見つけられません。アルファチャンネルの子ウィンドウを点滅させる

たとえば、ボタンの状態によって、アルファブレンドされ、ウィンドウにブリットされるいくつかの異なるビットマップを持つボタンがあります。状態が変わって別のビットマップを描画する必要がある場合は、まず背景を再描画するか、前の状態のビットマップから残ったピクセルとブレンドする必要があります。これは私が時折バックグラウンドの少し裂け目を得るところで、私がいくつかちらつきを得ているところです。

問題は、トップレベルの親ウィンドウで、ソリッドカラーではなくビットマップの背景を描画し、子コントロールをオーバーラップさせる可能性があります。子供のビットマップに基本色を掛けるだけでは、WS_CLIPCHILDRENを使用しているように疑問にはなりません。

ウィンドウにビットマップの背景があるので、上書きされる色を避けるために、trueWM_ERASEBKGNDに戻しています。

もちろん、ダブルバッファリングはこれをすべて解決するようですが、正しく動作させることができませんでした。私は、トップレベルウィンドウの場合はWS_COMPOSITED、子ウィンドウの場合はWS_TRANSPARENTと設定しました。

  • 私はInvalidateRect()とパスを呼び出す場合:それは新しいビットマップで子ウィンドウを再描画する時間が来るとき、私は(私は描画順序は、このような状況で働いているか理解していないから、最も可能性が高い)いくつかの問題を抱えています子ハンドルは子ウィンドウが実際に再描画されますが、背景は再描画されないため、ピクセルは互いに重ね合わされて重ね合わされます。
  • 私がInvalidateRect()を呼び出し、親のハンドルを渡すと、子ウィンドウの寸法で構成される矩形で背景が再描画されますが、子ウィンドウは描画されません。
  • 私が上記の両方を行うと、バックグラウンドは子ウィンドウと同様に再描画され、正確には私が望むように見えます - そうすることで、私はそれを作ることができましたフリッカーもう一度(これは本当に驚くことではありません。なぜなら、毎回InvalidateRect()を2回呼び出すのはひどくハックしているようです。なぜなら、それぞれの呼び出しでバッファがフリップして目的を破る可能性があるからです)。

私が結論に来たのは、ダブルバッファリングを処理するためにプログラムを修正する必要があるかどうか、またはダブルバッファリングがこの状況に役立つかどうかを本当に理解できないということです。私はそれが間違いないと思っていますが、私は、すべてをうまく再現するためには、どのように修正する必要があるのか​​よく分かりません。

+0

子ウィンドウがない場合、背景ウィンドウが再描画されていることをどのように知っていますか?子ウィンドウより大きな矩形を無効にしていますか? –

+0

親のハンドルでInvalidateRect()を呼び出すと、親に描画している背景イメージが子ウィンドウ上に再描画されますが、子ウィンドウの後に親が描画された場合と同様に、子ウィンドウは描画されません。 msdnは "ウィンドウのすべての子孫がダブルバッファリングを使用してボトム・ツー・ペイントの順序を取得する"と述べていますが、それは予想されることです。 –

答えて

1

これは完全にオフベース可能性 - 私のGUIの日は長い長い時間前に...

だったが、あなたは自分のさまざまな状態のためのブレンドを事前に計算できませんでしたか?私はあなたのボタンが有効/無効とアップ/ダウンできるので、それはわずか4つの組み合わせだと仮定します。組み合わされたビットマップをあらかじめ計算しておくのはなぜですか?

既に結合されたビットマップと既存の状態との相互作用に問題がありますか?

+0

同じソースビットマップが異なるバックグラウンド数の上にある可能性があるため、インスタンスごとに自動化するとうまくいくようなものがあります。それは移動するウィンドウ(それのための階層化されたウィンドウに頼る必要があるかもしれません)に役立つことはありませんが、それは時々ボタンのちらつきを解決するでしょう。 –

2

layered windowsをお使いですか?多分それを試してみてください。

また、ダブルバッファリングの場合consider this technique

+0

私は可能な限りいくつかの具体的なケースに適用することができるとは思うが、私は非常に具体的な用途のためにレイヤードウィンドウを使用している。また、MFCを使用せずに手動でいくつかのダブルバッファリングを行うことも確かに別の選択肢です。 –

関連する問題