Question

Je voudrais créer une fenêtre de niveau supérieur (c'est-à-dire pas ws_child) avec transparence. Cependant, je ne veux pas que ce soit un masque simple, où un pixel donné est entièrement transparent ou entièrement opaque. Et je ne veux pas que ce soit tel que la fenêtre entière a un niveau alpha. Je voudrais plutôt que la fenêtre soit essentiellement entièrement transparente, avec un bitmap attiré avec un canal alpha, de sorte que le bitmap se mélange avec toutes les fenêtres derrière. Imaginez, disons, un Sunburst, où l'alpha d'une image se mélange d'Opaque à entièrement transparent vers l'extérieur du centre.

J'ai trouvé deux méthodes qui se rapprochent de ce que je veux faire, mais pas tout à fait. En utilisant des régions, je peux couper une section qui est tirée complètement transparente. À l'aide de fenêtres en couches, je peux également faire quelque chose de similaire (ou peut même rendre la fenêtre entière légèrement transparente, mais ce n'est pas du tout ce que je veux). J'ai examiné d'autres styles, tels que ws_ex_transparent et ws_ex_composite, mais en vain.

Je peux obtenir ce genre d'effet pour fonctionner très bien sur les fenêtres enfants, car ils se mélangent avec leurs fenêtres parentales dans la région de leurs parents. Le faire fonctionner de la même manière pour les fenêtres de haut niveau continue de m'échapper.

Je sais que cela peut être fait, car les gens m'ont assuré qu'ils l'ont vu dans d'autres programmes. J'ai l'impression de ne pas comprendre pleinement quelque chose de simple ici à propos de la peinture des fenêtres.

Était-ce utile?

La solution

Fenêtres en couches (WS_EX_LAYERED) doit faire le travail, en gardant à l'esprit que vous devez utiliser UpdateLayeredWindow() et un format bitmap quelque peu inhabituel (alpha pré-multiplié) pour spécifier des valeurs alpha par pixel (SetLayeredWindowAttributes() vous permettra uniquement de spécifier une seule valeur alpha pour la fenêtre ou la clé de couleur entière).

Vous dites que vous avez déjà essayé - quels problèmes avez-vous rencontrés?

Autres conseils

La seule façon dont je connais pour obtenir un alpha par pixel sur une fenêtre est updateLayeredWindow ().
Consultez ce lien MSDN: http://msdn.microsoft.com/en-us/library/ms997507.aspx

Notez que lors de l'utilisation de UpdateLayeredWindow, l'application n'a pas besoin de répondre à WM_PAINT ou à d'autres messages de peinture, car il a déjà fourni la représentation visuelle de la fenêtre et le système s'occupera de stocker cette image, de la composer et de la rendre sur le filtrer. UpdateLayeredWindow est assez puissant, mais il faut souvent modifier la façon dont une application Win32 existante dessine.

Je parie que ce sont les problèmes que vous rencontriez.

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