【问题标题】:How to draw Windows Classic style window elements如何绘制 Windows 经典风格的窗口元素
【发布时间】:2014-05-23 05:51:10
【问题描述】:

我们在程序中创建了一些自定义“窗口”,当启用VisualStyles 时,我们能够找到窗口的每个元素及其大小,并使用适当的渲染器自行绘制它们,包括最小化和关闭按钮。

VisualStyles 被禁用并且当前绘制我们自己的窗口但它们非常丑陋时,我们想做同样的事情。是否可以在 WinForms C# 中绘制 Windows 经典风格的窗口?我找到了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;
}

【问题讨论】:

    标签: c# windows winforms paint window-decoration


    【解决方案1】:

    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));
        }
    }
    

    在我的机器上看起来像这样,并不完全丑陋:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2012-01-01
      • 1970-01-01
      相关资源
      最近更新 更多