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 :
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 :
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);
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 :
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 :
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.