私は作成しましたレイヤードウィンドウを追加することで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 を使用します - これはウィンドウ スタイルではなくクラス スタイルであるため、ウィンドウ スタイルには表示されません。