我们在程序中创build了一些自定义的“窗口”,当启用VisualStyles
,我们可以find窗口的每个元素和它们的大小,并使用相应的Renderer来自己绘制包括最小化和closuresbutton。
当VisualStyles
被禁用时,我们希望做同样的事情,并且当前绘制我们自己的窗口,但是它们相当丑陋。 是否有可能在WinForms C#中绘制Windows经典样式窗口? 我find了ClassicBorderDecorator
但它是为WPF。
或者,如果不这样做,我们怎么能通过以下方式获得窗饰的像素尺寸:
// 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不提供经典风格的渲染器,你必须自己做。 使用SystemInformation类获取指标Color.FromKnownColor()以获取颜色。
唯一棘手的部分是让框架按钮看起来不错。 最好的办法是从字体中使用字形,而不是试图自己画。 Webdings字体是理想的。
我无法验证它将是多么接近匹配,我的机器启动Windows 8,不再支持经典风格。 否则一个强烈的暗示,你可能不应该投入太多时间在这:)一些示例代码:
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)); } }
在我的机器上看起来像这样,并不完全难看:)