31 votes

Windows Aero : Quelle couleur peindre pour faire apparaître du "verre" ?

Quelle couleur dois-je peindre dans l'espace client afin de rendre l'image de l'entreprise plus attrayante ? verre apparaître ?

J'ai étendu le cadre de mon formulaire dans la zone du client en utilisant :

DwmExtendFrameIntoClientArea(self.Handle, margins);

Je ne trouve pas de documentation officielle de Microsoft sur ce qu'il faut faire. couleur et/ou alpha le DWM cherchera à remplacer par du verre. La documentation sur DwmExtendFrameInClientArea ne mentionne même pas qu'une couleur personnalisée est nécessaire. Il n'y a que des ouï-dire et des mythes selon lesquels une couleur spéciale est même requise.

Le plus proche que je puisse trouver est un sujet sur MSDN :

Cadre de fenêtre personnalisé avec DWM

Pour que les images étendues soient visibles, les régions sous-jacentes à chacun des côtés de l'image étendue doivent avoir des données de pixel dont la valeur alpha est de 0.

Mise à jour : Et un billet de blog :

Windows Vista pour les développeurs - Partie 3 - Le gestionnaire de fenêtres du bureau

Il se trouve que le modèle binaire pour le noir RGB (0x00000000) est le même que le modèle binaire pour l'ARGB 100% transparent. Vous pouvez donc dessiner avec un pinceau GDI "noir" et, en supposant que vous ayez demandé au DWM de rendre la zone peinte floue, le résultat sera l'effet de verre souhaité.

Si je prends ce qu'ils disent littéralement ( données de pixel avec une valeur alpha de zéro ), je construis une couleur avec zéro alpha, et je la peins dans la zone étendue :

Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

mais l'effet de verre n'apparaît pas :

alt text


Si j'ignore la rubrique MSDN citée et que j'utilise plutôt un noir totalement opaque (plutôt qu'un noir totalement transparent) :

Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

l'effet de verre apparaît :

alt text

je suis donc amené à croire que noir opaque est la valeur du pixel que le DWM va rechercher pour le remplacer par du verre.

Mais alors comment puis-je peindre articles noirs sur la surface vitrée ?


J'ai testé la peinture noire rectangle sur la surface vitrée, avec un cercle à côté d'elle. Curieusement, le rectangle n'a pas apparaît, tandis que le cercle apparaît ; les deux sont de la même couleur :

Brush b = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
e.Graphics.FillRectangle(b, 11, 11, 32, 32);
e.Graphcis.FillEllipse(b, 43, 11, 32, 32);

alt text

Alors, qu'est-ce qui se passe ? Qu'est-ce que le approprié couleur à peindre dans la zone du cadre étendu pour faire apparaître le verre ?


Mise à jour 2

Utilisation de Adisak Afin d'isoler exactement l'endroit où se trouve la stupidité d'Aero, je dessine ici un rectangle noir à l'intérieur du cercle noir :

alt text

FillEllipse ne permet pas de dessiner des cercles noirs ?


Mise à jour 3

Pondidum se demandait si appeler Graphiques. avec un noir transparent la couleur rendrait le verre visible :

e.Graphics.Clear(Color.FromArgb(0,0,0,0));

Il fait fonctionne, mais vous ne pouvez toujours pas dessiner des éléments noirs opaques sur le verre :

alt text


Mise à jour 4

Regarder La bibliothèque Bridge Vista de Microsoft (enveloppes gérées autour des fonctionnalités de Vista qui ne seront pas ajoutées à .NET), ils ne parviennent à faire fonctionner le cadre de verre étendu que sur les formulaires WPF, et non WinForms.

Voir aussi

2voto

Dan Byström Points 5725
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

C'est en fait plutôt amusant. Cela signifie que vous êtes dessin quelque chose de complètement transparent - donc cela ne change absolument rien ! :-)

Devinez : si le noir (0,0,0) doit signifier "verre", que diriez-vous de dessiner (1,1,1) pour obtenir (presque) du noir ?

2voto

Aaron Klotz Points 4346

L'un des articles de blog dont le lien figure ci-dessus contient une discussion à ce sujet. La solution native était d'utiliser SetLayeredWindowAttributes pour que la clé de couleur ne soit pas noire.

1voto

Jason Diller Points 2566

Essayez de définir la TransparencyKey du formulaire sur Color.FromArgb(1,1,1) (ou une autre valeur appropriée de votre choix), puis de définir la backcolor du formulaire (ou de la partie que vous souhaitez vitrifier) sur cette même valeur.

C'est ainsi que j'ai réussi à le faire fonctionner sans rendre tout mon texte noir transparent/verre.

Je n'ai jamais réussi à trouver comment peindre le texte "lumineux" sur le verre. Il y avait toujours un rectangle noir derrière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X