Win32の:ドロップシャドウ名誉非矩形レイヤードウィンドウを作成する方法は?
-
19-09-2019 - |
質問
私は追加することによって、noreferrer">レイヤードウィンドウをrel="nofollow href="http://msdn.microsoft.com/en-us/library/ms997507.aspx" WS_EX_LAYERED の拡張スタイル:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windowsがクロマキーカラー値として黒を使用します。私は明白な問題を作るために黒の大きな境界線を残すつもりです。
<時間> ウィンドウが構築された後、、私はにそれを伝えますクロマキーカラーのようにブラック使用:
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
今ポップアップレイヤーウィンドウが部分的に透明表示されます:
<時間>の問題は、最後のステップです。私は利用できる、 CS_DROPSHADOW のクラススタイルを使用したいですWindows XPのために、ドロップシャドウを作成します:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
ドロップシャドウが表示されますが、影が、元の長方形の窓を包囲し、かつ考慮されていませんレイヤードウィンドウが提供するウィンドウの透明ます:
誰がドロップシャドウを行います私はどこか見逃している魔法のオプションは、非矩形レイヤードウィンドウを称えるものを知っていますか?
<時間>この問題が表示される場所の別の例では、計6Pxパディング/マージンが含まれていないときです。 Windows®のテーマで描かれたヒントウィンドウは非矩形です。このウィンドウは透明で小さな目に見えるギャップを残すが、ドロップシャドウが表示されない:
あなたは、Internet Explorerからこのヒントから見ることができるように、Microsoftは、それを動作させることに成功した。
<時間>近いのWindows tooltips
クラスのヒントウィンドウで探しています。 SpyXX のを使用して - 私はそのウィンドウ四角形を取得し、クラススタイルができます:
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で追加されました。
。解決
透明積層窓領域上好ましい技術として記載されます。
しかし、CS_DROPSHADOW
ののは、地域に注意を払うん。あなたはトリミングやそれ以外の地域を使用して、ウィンドウを形作る場合は、ドロップシャドウは、新しいアウトラインに従います。
幸いにも、あなたは<全角> のレイヤードウィンドウで領域を使用し、2つを組み合わせることにより、あなたが探している効果を得ることができます。
ところで:tooltips_class32 ののCS_DROPSHADOWを使用しない - それは、クラスのスタイルではなく、ウィンドウスタイルだから、あなたは、ウィンドウのスタイルでそれを見ることはありません。
。他のヒント
なぜあなたはLWA_ALPHAを使用して、画像に影を構築しませんか?
あなたのコメントにREPONSEで編集します:
A)のみの影のためのPNGをチャネリングアルファを使用して、あなたを停止しません。一緒に2枚の画像をBLTと単一の画像として使用する。
B)そのハードではないドロップシャドウを生成します。画像では、3種類のアルファ値との黒を掲載。
C)しかし、それは動作しませんがそれをしませんか?すなわち、時間は創造的な取得します。
D)その後、試してみて、窓はそれがあなたのためにしないだろう何かを得ることはありません。
E)は完全に無関係です。レイヤードウィンドウがあなたのためにすることを扱う。
私は強くあなたは彼らがあなたの目標にあなたを助けることができるので、レイヤードウィンドウの詳細についてはお勧めします。
EDIT2:あなたは、ビットマップを持っています。あなたが変換する必要があります。他のすべては255のアルファ(未を持つことになります0のアルファを持っていることを修正した画像の上にスキャンして、ビットは(黒あなた自身を識別することにより)カラーキーと鶏される見つけるために、そのかなり簡単下のカラーフォーマットから32ビット画像に画像、新しいDCを作成し、画像をコピーすることによってこれを行うことができます)。これは、あなたLWA_COLORKEYと同様LWA_ALPHAと同じ効果が得られます。 (R = 0、G = 0、B = 0、A = 0)に色の変化エッジの画素を識別するためにそこからそのかなり簡単。あなたはその後、64に192のn個のアルファを持っているために、その最初の画素、128への一撃を、以下いずれかの変更になりました影のようになります。画像の下alpha'dグラデーションを持っています。あなたが望む効果を得るために、αを調整することができます。
CS_DROPSHADOW
は、標準の長方形の窓で動作します。 WS_EX_LAYERED
の窓はすべてをサポートしていません。彼らは正確に何をしたい描画するための低レベル、セルフサービス方式のより多くのです。
ドロップシャドウを取得するには、ドロップシャドウ画像におけるアルファチャンネルから自分を生成する必要があります。