4

透明なトップレベル (つまり、WS_CHILD ではない) ウィンドウを作成したいと考えています。ただし、特定のピクセルが完全に透明または完全に不透明な単純なマスクにはしたくありません。そして、ウィンドウ全体にアルファレベルがあるようなものにしたくありません。むしろ、ビットマップがその背後にあるウィンドウとブレンドされるように、ウィンドウを基本的に完全に透明にし、ビットマップをアルファチャンネルで描画したいと思います。たとえば、画像自体のアルファが不透明から完全に透明にブレンドされて中心から外側に向かうサンバーストを想像してみてください。

どちらも私がやりたいことに近いが、完全ではない2つの方法を見つけました。領域を使用して、完全に透明に描画されたセクションを切り取ることができます。レイヤード ウィンドウを使用して、同様のことを行うこともできます (または、ウィンドウ全体をわずかに透明にすることもできますが、それは私が望んでいることではありません)。WS_EX_TRANSPARENT や WS_EX_COMPOSITE などの他のスタイルを調べましたが、役に立ちませんでした。

子ウィンドウは親の領域内で親ウィンドウとブレンドされているため、この種の効果を子ウィンドウでうまく機能させることができます。トップレベルのウィンドウで同様に動作させることは、私を避け続けています。

人々が他のプログラムで見たことがあると私に保証したので、私はこれができることを知っています. ここでウィンドウのペイントに関する単純なことを完全に理解していないように感じます。

4

2 に答える 2

2

ピクセルごとのアルファ値を指定するには、やや変わったビットマップ形式( 32 ビット、事前に乗算されたアルファ) をWS_EX_LAYERED使用する必要があることに注意してください(単一のアルファ値のみを指定できます)。ウィンドウ全体またはカラーキー)。UpdateLayeredWindow()SetLayeredWindowAttributes()

すでにこれを試したことがあるとおっしゃっていますが、どのような問題がありましたか?

于 2009-02-16T23:14:54.010 に答える
1

ウィンドウでピクセルごとのアルファを取得する唯一の方法は、UpdateLayeredWindow() です。
この MSDN リンクをチェックしてください: http://msdn.microsoft.com/en-us/library/ms997507.aspx

UpdateLayeredWindow を使用する場合、アプリケーションは WM_PAINT またはその他の描画メッセージに応答する必要がないことに注意してください。これは、ウィンドウの視覚的表現が既に提供されており、システムがその画像の保存、構成、レンダリングを処理するためです。画面。UpdateLayeredWindow は非常に強力ですが、多くの場合、既存の Win32 アプリケーションの描画方法を変更する必要があります

これらはあなたが経験していた問題だと思います。

于 2009-02-17T00:54:53.317 に答える