ピクセル単位のアルファチャンネルでビットマップを含む子コントロールを描画するとき、再描画が必要なときはいつでもちらつきが増えています。実際のブレンドは正しく機能しています。私はちらつきを減らすことに関する多くの情報(例えばthis questionまたはthis site)を見つけましたが、この状況に特に当てはまるものは見つけられません。アルファチャンネルの子ウィンドウを点滅させる
たとえば、ボタンの状態によって、アルファブレンドされ、ウィンドウにブリットされるいくつかの異なるビットマップを持つボタンがあります。状態が変わって別のビットマップを描画する必要がある場合は、まず背景を再描画するか、前の状態のビットマップから残ったピクセルとブレンドする必要があります。これは私が時折バックグラウンドの少し裂け目を得るところで、私がいくつかちらつきを得ているところです。
問題は、トップレベルの親ウィンドウで、ソリッドカラーではなくビットマップの背景を描画し、子コントロールをオーバーラップさせる可能性があります。子供のビットマップに基本色を掛けるだけでは、WS_CLIPCHILDREN
を使用しているように疑問にはなりません。
ウィンドウにビットマップの背景があるので、上書きされる色を避けるために、true
をWM_ERASEBKGND
に戻しています。
もちろん、ダブルバッファリングはこれをすべて解決するようですが、正しく動作させることができませんでした。私は、トップレベルウィンドウの場合はWS_COMPOSITED
、子ウィンドウの場合はWS_TRANSPARENT
と設定しました。
- 私は
InvalidateRect()
とパスを呼び出す場合:それは新しいビットマップで子ウィンドウを再描画する時間が来るとき、私は(私は描画順序は、このような状況で働いているか理解していないから、最も可能性が高い)いくつかの問題を抱えています子ハンドルは子ウィンドウが実際に再描画されますが、背景は再描画されないため、ピクセルは互いに重ね合わされて重ね合わされます。 - 私が
InvalidateRect()
を呼び出し、親のハンドルを渡すと、子ウィンドウの寸法で構成される矩形で背景が再描画されますが、子ウィンドウは描画されません。 - 私が上記の両方を行うと、バックグラウンドは子ウィンドウと同様に再描画され、正確には私が望むように見えます - そうすることで、私はそれを作ることができましたフリッカーもう一度(これは本当に驚くことではありません。なぜなら、毎回
InvalidateRect()
を2回呼び出すのはひどくハックしているようです。なぜなら、それぞれの呼び出しでバッファがフリップして目的を破る可能性があるからです)。
私が結論に来たのは、ダブルバッファリングを処理するためにプログラムを修正する必要があるかどうか、またはダブルバッファリングがこの状況に役立つかどうかを本当に理解できないということです。私はそれが間違いないと思っていますが、私は、すべてをうまく再現するためには、どのように修正する必要があるのかよく分かりません。
子ウィンドウがない場合、背景ウィンドウが再描画されていることをどのように知っていますか?子ウィンドウより大きな矩形を無効にしていますか? –
親のハンドルでInvalidateRect()を呼び出すと、親に描画している背景イメージが子ウィンドウ上に再描画されますが、子ウィンドウの後に親が描画された場合と同様に、子ウィンドウは描画されません。 msdnは "ウィンドウのすべての子孫がダブルバッファリングを使用してボトム・ツー・ペイントの順序を取得する"と述べていますが、それは予想されることです。 –