Win32: ドロップ シャドウを長方形以外のレイヤード ウィンドウに適用するにはどうすればよいでしょうか? 質問する

Win32: ドロップ シャドウを長方形以外のレイヤード ウィンドウに適用するにはどうすればよいでしょうか? 質問する

私は作成しましたレイヤードウィンドウを追加することでWS_EX_レイヤード拡張スタイル:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows はクロマ キーの色値として黒を使用します。問題が明らかになるように、大きな黒の境界線を残します。

代替テキスト


ウィンドウが構築された後、私はクロマキーカラーとして黒を使用する:

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

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

代替テキスト


問題は最後のステップです。使いたいCS_ドロップシャドウWindows XP 以降で使用可能なクラス スタイルを使用して、ドロップ シャドウを作成します。

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

ドロップ シャドウは表示されますが、シャドウは元の長方形のウィンドウを囲むため、レイヤード ウィンドウによって提供されるウィンドウの透明度は考慮されません。

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


この問題が発生するもう 1 つの例は、6 ピクセルのパディング/マージンを含めない場合です。Windows® テーマによって描画されるヒント ウィンドウは長方形ではありません。これにより、ウィンドウが透明であるがドロップ シャドウが表示されていない小さな目に見える隙間が残ります。

代替テキスト

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

代替テキスト


Windowstooltipsクラスのヒントウィンドウを詳しく見てみましょう。スパイXX- ウィンドウの矩形とクラス スタイルを取得できます。

SpyXX はこう言っています:

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

つまり、ウィンドウ自体は 104 x 20 ピクセルであり、ドロップ シャドウはウィンドウ自体の外側にあることになります (これは と一致しています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 2000 から存在していました。CS_DropShadow は XP で追加されました。

ベストアンサー1

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

しかし、CS_DROPSHADOW する領域に注意してください。領域を使用してウィンドウを切り取ったり、その他の方法で形を整えたりすると、ドロップ シャドウは新しいアウトラインに従います。

幸いなことに、あなたはできるレイヤー化されたウィンドウを持つ領域を使用し、2 つを組み合わせることで、目的の効果が得られます。

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

おすすめ記事