Frage

i eine geschichteten Fenster rel="nofollow, indem es das die WS_EX_LAYERED erweiterten Stil:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

wird Windows schwarz verwenden als der Chroma-Key-Farbwert. Ich werde eine große Grenze von schwarzen verlassen, um das Problem offensichtlich zu machen:


Nachdem das Fenster aufgebaut ist, ich sage es verwenden schwarz als Chroma-Key-Farbe :

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

Nun ist das Popup-Fenster erscheint schichtete teilweise transparent:


Das Problem ist der letzte Schritt. verwenden, ich will CS_DROPSHADOW Klasse Stil, erhältlich da Windows XP, einen Drop-Schatten zu erstellen:

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

Der Schlagschatten erscheint, aber der Schatten umgibt die ursprünglichen rechteckigen Fenster, und nicht berücksichtigt nicht die Transparenz des Fensters von dem geschichteten Fenster bereitgestellt:

Wer weiß, was magische Option i irgendwo verpasst haben, die den Schlagschatten machen das nicht rechteckigen geschichteten Fenster ehren?


Ein weiteres Beispiel dafür, wo dieses Problem erscheint, wenn Sie den 6px padding / margin nicht enthalten. Das Hinweisfenster, wie Windows® Themen gezeichnet ist nicht rechteckig. Dies läßt eine kleine sichtbare Lücke, wo das Fenster transparent ist, aber die Schlagschatten nicht erscheint:

Microsoft hat es geschafft, damit es funktioniert, wie man es von diesem Hinweis von Internet Explorer sehen können:


Bei genauerer Betrachtung einer Windows tooltips Klasse Hinweisfenster. Mit SpyXX - i sein Fenster rect bekommen, und Klassenstile:

SpyXX sagt:

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

So deutet alles auf das Fenster selbst 104x20 Pixel sein, mit dem Schlagschatten außerhalb des Fensters selbst. (Was steht im Einklang mit CS_DROPSHADOW.)

Als nächstes i an die Stile der tooltips Fensterklasse aussehen:

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

Interessanterweise scheint es nicht verwenden CS_SAVEBITS (0x800); die für kleine nützlich, kurzlebig, Fenster.

Auch nicht es verwenden CS_DROPSHADOW (0x20000). So, jetzt frage ich mich, wie es außerhalb des eigenen Fenster zu zeichnen?

. Hinweis: Transparente Ebenen-Fenster wird als die bevorzugte Technik über Regionen dokumentiert

Edit: lappenden Fenster gibt es schon mit Windows 2000 CS_DropShadow wurde mit XP hinzugefügt

.
War es hilfreich?

Lösung

  

Transparente Ebenen-Fenster wird als die bevorzugte Technik über Regionen dokumentiert.

Allerdings CS_DROPSHADOW hat Augenmerk auf die Regionen. Wenn Sie zuschneiden oder auf andere Weise gestalten Fenster einen Bereich verwenden, wird der Schlagschatten der neue Kontur folgen.

Zum Glück, Sie können Verwendung Regionen mit Ebenen-Fenster, und durch die Kombination der beiden den Effekt bekommen Sie suchen.

BTW:. Tooltips_class32 hat Verwendung CS_DROPSHADOW - Sie werden es nicht in den Fenster-Stile, weil es sich um eine Klasse-Stil ist, kein Fenster Stil

Andere Tipps

Warum nicht LWA_ALPHA verwenden und den Schatten in das Bild bauen?

Bearbeiten in reponse auf Ihren Kommentar:

A) Hat man nicht mehr aufhören ein Alpha mit kanalisiert PNG für einen Schatten nur. BLT die 2 Bilder zusammen und die Verwendung als ein einziges Bild.
B) Es ist nicht schwer, einen Schlagschatten zu erzeugen. Im Bild geschrieben Sie seine schwarz mit 3 verschiedenen Alpha-Werten.
C), aber es funktioniert nicht, nicht wahr? dh Zeit, um kreativ.
D) Dann versuchen Sie nicht und nutzen Sie Fenster, etwas zu tun es für Sie nicht tun wird.
E) ist völlig irrelevant. Ebenen-Fenster handhaben, dass für Sie.

ich empfehlen Sie mehr über Ebenen-Fenster lernen, weil sie Sie zu Ihrem Ziel helfen können.

Edit2: Sie haben die Bitmap. Es ist ziemlich einfach auf das Bild zu scannen und welche Bits wird Farbe verkeilt (durch die Identifizierung der schwarze selbst) und Henne modifizieren, dass haben einen Alpha von 0, wo alles andere wird ein Alpha von 255 (nicht gefunden: Sie können konvertieren das Bild auf einem 32-Bit-Bild von einem niedrigeren Farbformat, können Sie dies tun, indem Sie einen neuen DC Erstellen und Kopieren des Bildes). Dies gibt Ihnen die gleiche Wirkung mit LWA_ALPHA wie bei LWA_COLORKEY. Von dort aus seiner relativ leicht, die Pixel an der Kante, wo sich die Farbe ändert, um (R = 0, G = 0, B = 0, A = 0) zu identifizieren. Sie ändern dann das erste Pixel eine n alpha von 192 zu haben, die einen Schlag es auf 128 und die unten auf 64. Sie haben nun eine alpha'd Abstufung unter dem Bild, das wie der Schatten aussehen wird. Sie können die Alpha einstellen, um den Effekt erhalten Sie wollen.

CS_DROPSHADOW funktioniert nur mit Standard-rechteckigen Fenstern. WS_EX_LAYERED Fenster nicht unterstützen alles. Sie sind eher ein Low-Level-Self-Service-Methode ziehen genau das, was Sie wollen.

Um einen Schlagschatten zu bekommen, werden Sie sich die Drop-Schatten aus dem Alphakanal in dem Bild haben zu erzeugen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top