【问题标题】:Graphics.DrawPath and LinearGradientBrush issueGraphics.DrawPath 和 LinearGradientBrush 问题
【发布时间】:2015-08-03 10:37:21
【问题描述】:

关于我几周前提出的这个问题

LinearGradientBrush does not render correctly

考虑以下代码:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    Rectangle rect = new Rectangle(100, 100, 200, 100);
    using(LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Red, Color.Blue, 90))
    {
        using(Pen pen = new Pen(brush, 1))
        {
            pen.Alignment = PenAlignment.Inset;
            e.Graphics.DrawRectangle(pen, rect);
        }
    }            
}

产生这个结果...

为什么应该有蓝线的地方有红线,我该如何解决这个问题?

Pen.Alignment = PenAlignment.Inset 不起作用!

【问题讨论】:

    标签: c# winforms gdi+ gdi lineargradientbrush


    【解决方案1】:

    钢笔(或 Graphics DrawMethods)倾向于在其边界之外进行绘制。我认为微软认为这是一项功能,但我一直不理解。

    尝试为笔使用较小的矩形:

    using (var brush = new LinearGradientBrush(rect, Color.Red, Color.Blue, 90)) {
      using (Pen pen = new Pen(brush, 1)) {
        e.Graphics.DrawRectangle(pen, new Rectangle(rect.X, rect.Y,
                                                    rect.Width - 1, rect.Height - 1));
      }
    }
    

    【讨论】:

    • 我认为这没有帮助。而且我怀疑 DrawRectangle 方法而不是 FillRectangle ..
    • @TaW 要么 - 要么我猜。 DrawMethods 取 Pens,FillMethods 取画笔。令人讨厌的是,它们从不在同一个矩形中绘制。
    • 啊,我明白了……当我画了一个 32x32 的矩形并用 Paint 检查它时,它实际上是 33x33。谢谢,这有很大帮助! :-)
    • 这解决了一半的问题...用 new Rectangle(10, 10, 40, 23) 试试这个原理...我得到一个大小正确但顶部和底部是蓝色而不是红色的矩形顶部和底部......有什么想法吗?
    • 其实270度的时候上下都是蓝色的,90度的时候上下还是红色的
    【解决方案2】:

    好的,总结一下:DrawRectangle 总是 overdraws 1 个像素 (*),因此 LinearGradientBrush 以第一种颜色重新开始。

    是的,Lars 有一个解决方案,但这里有一个有趣的替代方案:

      brush.WrapMode = WrapMode.TileFlipXY;
    

    这确保渐变不会在必须过度绘制时从一开始就开始,而是在两个方向上反转,因此额外的像素以正确的颜色绘制,您无需操作两者之一Rectangle 尺寸..

    好吧,如果您需要总精度,它可能是第二好的,因为最后一行和最后一列的颜色与它们的邻居相同..但不必处理两种尺寸可能是值得的..

    (*) 这就是为什么您不能使用它来绘制1x1 正方形/像素。相反,您需要使用FillRectangle..

    【讨论】:

    • 有趣的解决方案,知识+1。实际上,我认为操纵矩形大小是正确的解决方案,例如,如果我定义一个 32x32 的矩形,DrawRectangle 将过度绘制并创建一个 33x33 的矩形(假设笔为 1px 宽)。话虽这么说,我并没有贬低这个代码宝石......我认为这可能会派上用场(尽管我猜测转向 WPF 正在扼杀所有 System.Drawing、GDI 和 Windows 窗体的东西!:-(
    • 好吧,这个动作还在等待发生;不到 20% 的新项目是 WPF.. 同意您的解决方案是正确的,不过 ;-)
    • 我认为 WPF 的唯一问题是学习曲线。我已经开始使用它了,但我基本上不得不扔掉我所知道的关于 WinForms 的一切。话虽如此;我认为 WPF 不会出现在跨平台的 .NET Core/vNext 库中,所以我猜 Winforms 仍然是开发跨平台桌面应用程序的方式
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多