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 で追加されました。