19

WS_EX_LAYERED拡張スタイルを追加して、レイヤード ウィンドウを作成しました。

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows は、クロマ キー カラー値として黒を使用します。問題を明確にするために、黒の大きな境界線を残します。

代替テキスト


ウィンドウが構築された後、クロマキー カラーとして黒を使用するように指示します。

SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);

ポップアップ レイヤード ウィンドウが部分的に透明に表示されます。

代替テキスト


問題は最後のステップです。Windows XP 以降で利用できるCS_DROPSHADOWクラス スタイルを使用して、ドロップ シャドウを作成します。

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

ドロップ シャドウが表示されますが、影は元の四角形のウィンドウを囲んでおり、レイヤード ウィンドウによって提供されるウィンドウの透明度は考慮されていません。

ドロップシャドウが非長方形のレイヤードウィンドウを尊重するようにする、どこかで見逃した魔法のオプションを誰かが知っていますか?


この問題が発生する別の例は、6px のパディング/マージンを含めない場合です。Windows® テーマによって描画されるヒント ウィンドウは、四角形ではありません。これにより、ウィンドウが透明になる小さな隙間が残りますが、ドロップ シャドウは表示されません。

代替テキスト

Internet Explorer からのこのヒントからわかるように、Microsoft はそれを機能させることに成功しました。

代替テキスト


Windowstooltipsクラス ヒント ウィンドウの拡大図。SpyXXを使用すると、そのウィンドウ rect とクラス スタイルを取得できます。

SpyXX 言います:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

したがって、すべてがウィンドウ自体が 104x20 ピクセルであり、ドロップ シャドウがウィンドウ自体の外側にあることを示しています。(これは と一致していCS_DROPSHADOWます。)

tooltips次に、ウィンドウ クラスのスタイルを確認します。

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

CS_SAVEBITS興味深いことに、 ( 0x800);は使用しません。これは、小さくて寿命の短いウィンドウに役立ちます。

CS_DROPSHADOW( )も使用しません0x20000。それで、自分のウィンドウの外でどのように描画しているのだろうか?

注:透明なレイヤード ウィンドウは、領域よりも優先される手法として文書化されています。

編集:レイヤード Windows は Windows 2000 で使用されています。CS_DropShadow は XP で追加されました。

4

3 に答える 3

8

透明なレイヤード ウィンドウは、領域よりも優先される手法として文書化されています。

ただし、地域に注意を払いますCS_DROPSHADOW 領域を使用してウィンドウをトリミングまたは整形すると、ドロップ シャドウは新しいアウトラインに従います。

さいわい、レイヤード ウィンドウでリージョンを使用できます。この 2 つを組み合わせることで、探している効果が得られます。

ところで: tooltips_class32CS_DROPSHADOW を使用します。ウィンドウ スタイルではなくクラス スタイルであるため、ウィンドウ スタイルには表示されません。

于 2010-02-10T10:00:25.863 に答える
2

LWA_ALPHAを使用して、画像に影を付けてみませんか?

コメントに応じて編集します。

A)シャドウのみにアルファチャネルPNGを使用することを止めません。2つの画像をまとめて、1つの画像として使用します。
B)ドロップシャドウを生成するのは難しくありません。画像では、3つの異なるアルファ値で黒を投稿しました。
C)しかし、それは機能しませんか?つまり、創造性を発揮する時間です。
D)それなら、ウィンドウにそれがあなたのためにしないことをさせようとしないでください。
E)まったく関係ありません。レイヤードウィンドウがそれを処理します。

レイヤードウィンドウは目標を達成するのに役立つため、レイヤードウィンドウについて詳しく知ることを強くお勧めします。

Edit2:ビットマップがあります。画像をスキャンして、どのビットがカラーキーイングされるか(自分で黒を識別することによって)を見つけるのはかなり簡単です。それを変更して、アルファを0にし、他のすべてのビットを255にします(変換する必要がある場合があります)。画像を低カラーフォーマットから32ビット画像に変換するには、新しいDCを作成して画像をコピーすることでこれを行うことができます)。これにより、LWA_ALPHAでもLWA_COLORKEYと同じ効果が得られます。そこから、色が変化するエッジのピクセルをかなり簡単に識別できます(R = 0、G = 0、B = 0、A = 0)。次に、最初のピクセルを192のアルファに変更し、1つは128に、下のピクセルは64にブローします。これで、画像の下に影のように見えるアルファのグラデーションができました。アルファを調整して、必要な効果を得ることができます。

于 2010-02-08T19:35:05.727 に答える
0

CS_DROPSHADOW標準の長方形のウィンドウでのみ機能します。 WS_EX_LAYEREDWindowsはすべてをサポートしているわけではありません。これらは、必要なものを正確に描画するための、より低レベルのセルフサービス方式です。

ドロップシャドウを取得するには、画像のアルファチャネルから自分でドロップシャドウを生成する必要があります。

于 2010-02-09T21:14:20.190 に答える