Comment dessiner des éléments de fenêtre de style Windows Classic

Nous créons quelques «fenêtres» personnalisées dans notre programme et lorsque VisualStyles est activé, nous pouvons trouver chaque élément de la fenêtre et leur taille et les peindre nous-mêmes, y compris les boutons Réduire et Fermer à l’aide des Renderers appropriés.

Nous aimerions faire la même chose lorsque VisualStyles est désactivé et dessine actuellement nos propres fenêtres, mais elles sont très laides. Est-il possible dans WinForms C # de dessiner les fenêtres de style Windows Classic? J’ai trouvé le ClassicBorderDecorator mais c’est pour WPF.

Ou, à défaut, comment pouvons-nous obtenir les tailles de pixel des décorations de fenêtres que nous faisons de la manière suivante:

 // Get the height of the window caption. if (SetRenderer(windowElements["windowCaption"])) { captionHeight = renderer.GetPartSize(graphics.Graphics, ThemeSizeType.True).Height; } // Get the thickness of the left, bottom, // and right window frame. if (SetRenderer(windowElements["windowLeft"])) { frameThickness = renderer.GetPartSize(graphics.Graphics, ThemeSizeType.True).Width; } 

Windows ne fournit pas de moteur de rendu pour le style classique, vous devrez faire votre propre cuisine. Utilisez la classe SystemInformation pour obtenir les mésortingques Color.FromKnownColor () afin d’obtenir les couleurs.

La seule partie délicate est de faire bien paraître les boutons du cadre. La meilleure chose à faire est d’utiliser un glyphe à partir d’une police au lieu d’essayer de la peindre vous-même. La police Webdings est idéale pour cela.

Je ne peux pas vérifier à quel point ce sera une correspondance, ma machine démarre Windows 8 et ne supporte plus le style classique. Sinon un indice fort que vous ne devriez probablement pas y consacrer trop de temps 🙂 Quelques exemples de code:

 protected override void OnPaintBackground(PaintEventArgs e) { base.OnPaintBackground(e); var captionHeight = SystemInformation.CaptionHeight; int border = SystemInformation.Border3DSize.Width; var color1 = Color.FromKnownColor(activated ? KnownColor.ActiveCaption : KnownColor.InactiveCaption); var color2 = Color.FromKnownColor(activated ? KnownColor.GradientActiveCaption : KnownColor.GradientInactiveCaption); var captionrc = new Rectangle(0, 0, this.ClientSize.Width, captionHeight); using (var brush = new LinearGradientBrush(captionrc, color1, color2, 0, false)) { e.Graphics.FillRectangle(brush, captionrc); } int textx = border; if (this.Icon != null) { int height = SystemInformation.SmallIconSize.Height; var iconrc = new Rectangle(border, (captionHeight - height)/2, height, height); textx += height + border; e.Graphics.DrawIcon(this.Icon, iconrc); } var color = Color.FromKnownColor(activated ? KnownColor.ActiveCaptionText : KnownColor.InactiveCaptionText); using (var font = new Font(this.Font.FontFamily, SystemInformation.CaptionHeight - 4 * border, GraphicsUnit.Pixel)) { TextRenderer.DrawText(e.Graphics, this.Text, font, new Point(textx, border), color); } using (var font = new Font(new FontFamily("Webdings"), captionHeight - 4 * border, GraphicsUnit.Pixel)) { var glyphs = this.WindowState == FormWindowState.Maximized ? "\u0030\u0031\u0072" : "\u0030\u0031\u0072"; var width = TextRenderer.MeasureText(glyphs, font).Width; TextRenderer.DrawText(e.Graphics, glyphs, font, new Point(this.ClientSize.Width - width, border), Color.FromKnownColor(KnownColor.WindowFrame)); } } 

On dirait ça sur ma machine, pas tout à fait moche 🙂

entrer la description de l'image ici