2

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

LinearGradientBrush 无法正确渲染

考虑以下代码:

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 不起作用!

4

2 回答 2

3

钢笔(或 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));
  }
}

在此处输入图像描述

于 2015-05-21T16:41:10.070 回答
1

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

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

  brush.WrapMode = WrapMode.TileFlipXY;

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

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

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

于 2015-05-21T18:06:38.973 回答