Question

J'ai créé un couche en ajoutant le la WS_EX_LAYERED style étendu:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows utilisera noir comme la valeur de couleur chroma key. Je vais laisser une grande frontière de noir pour rendre le problème évident:


Une fois la fenêtre est construite, je dis à utiliser le noir comme une couleur chroma-key :

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

Maintenant, la fenêtre des couches popup apparaît partiellement transparent:


Le problème est la dernière étape. je veux utiliser le style de classe CS_DROPSHADOW , disponible depuis Windows XP, pour créer une ombre portée:

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

L'ombre apparaît, mais l'ombre entoure la fenêtre rectangulaire d'origine, et ne prend pas en compte la transparence de la fenêtre fournie par la fenêtre en couches:

Quelqu'un sait quelle est l'option magique que j'ai raté quelque part qui fera l'ombre honorer la fenêtre des couches non-rectangulaire?


Un autre exemple où cette question apparaît lorsque vous est de ne pas inclure le rembourrage de 6px / marge. La fenêtre de conseil comme dessiné par thèmes Windows® est non rectangulaire. Cela laisse un petit espace visible où la fenêtre est transparente, mais l'ombre ne semble pas:

Microsoft a réussi à le faire fonctionner, comme vous pouvez le voir dans cette astuce à partir d'Internet Explorer:


regardant de plus près à une fenêtre de conseil de classe tooltips de Windows. En utilisant SpyXX - je peux obtenir sa rect fenêtre et styles de classe:

SpyXX dit:

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

tout porte à la fenêtre étant elle-même 104x20 pixels, avec l'ombre en dehors de la fenêtre elle-même. (Ce qui est cohérent avec CS_DROPSHADOW.)

Ensuite je peux regarder les styles de la classe de fenêtre 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

Fait intéressant, il n'utilise pas CS_SAVEBITS (0x800); ce qui est utile pour les petites, de courte durée, les fenêtres.

Elle n'utilise CS_DROPSHADOW (0x20000). Alors maintenant, je me demande comment est-il dessine en dehors de sa propre fenêtre?

Remarque:. Fenêtres en couches transparentes est documenté que la technique préférée sur les régions

Edit: les fenêtres en couches ont été autour avec Windows 2000. CS_DropShadow a été ajouté avec XP

.
Était-ce utile?

La solution

  

fenêtres transparentes en couches est documentée comme la technique préférée au-dessus de régions.

Cependant, CS_DROPSHADOW Finalité prêter attention aux régions. Si vous recadrez ou autre forme de votre fenêtre à l'aide d'une région, la baisse ombre suivra le nouveau plan.

Heureusement, vous peut régions d'utilisation avec des fenêtres en couches, et en combinant les deux obtenir l'effet que vous recherchez.

BTW:. Tooltips_class32 Finalité utilisation CS_DROPSHADOW - vous ne verrez pas dans les styles de fenêtres, car il est un style de classe, pas un style de fenêtre

Autres conseils

Pourquoi utilisez-vous pas LWA_ALPHA et de construire l'ombre dans l'image?

Modifier dans Reponse à votre commentaire:

A) Ne vous arrêtez d'utiliser un alpha canalisé PNG pour une ombre seulement. BLT les 2 images ensemble et utiliser comme une seule image.
B) ne est pas difficile de générer une ombre portée. Dans l'image que vous avez posté son noir avec 3 valeurs alpha différentes.
C) Mais ça ne marche pas que ce soit? à savoir Le temps de faire preuve de créativité.
D) Ensuite, ne pas essayer et obtenir des fenêtres pour faire quelque chose, il ne le fera pas pour vous.
E) est tout à fait hors de propos. fenêtres en couches poignée pour vous.

Je vous recommande vivement en apprendre davantage sur les fenêtres en couches, car ils peuvent vous aider à atteindre votre objectif.

Edit2: Vous avez le bitmap. Son assez facile à numériser sur l'image et trouver les bits sera de couleur assortie (en identifiant le vous-même noir) et la poule modifier que d'avoir un alpha de 0 où tout le reste aura un alpha de 255 (Non: Vous pourriez avoir à convertir l'image à une image 32 bits à partir d'un format de couleur inférieure, vous pouvez le faire en créant un nouveau DC et la copie de l'image). Cela vous donnera le même effet avec LWA_ALPHA comme avec LWA_COLORKEY. De là, son assez facile d'identifier le pixel au niveau du bord, où les changements de couleur à (R = 0, G = 0, B = 0, A = 0). Vous changer alors que le premier pixel d'avoir un n alpha de 192, le seul coup à 128 et celui ci-dessous à 64. Vous avez maintenant une gradation de alpha'd sous l'image qui ressemble à l'ombre. Vous pouvez régler l'alpha pour obtenir l'effet souhaité.

CS_DROPSHADOW fonctionne uniquement avec des fenêtres rectangulaires standard. fenêtres WS_EX_LAYERED ne supportent pas tout. Ils sont plus d'un faible niveau, la méthode libre-service pour dessiner exactement ce que vous voulez.

Pour obtenir une ombre portée, vous devrez générer le menu ombre vous du canal alpha dans l'image.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top