Graphics.DrawPath和LinearGradientBrush问题

时间:2015-05-21 16:16:30

标签: c# winforms gdi+ gdi lineargradientbrush

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

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

产生这个结果......

Brush

为什么有一条红线应该有一条蓝线,我该如何解决?

Pen.Alignment = PenAlignment.Inset没有用!

2 个答案:

答案 0 :(得分:3)

笔(或图形DrawMethods)倾向于超出其边界。我认为微软认为这是一个功能,但我从来不理解它。

尝试使用较小的矩形笔:

section() (<MUL>|<DIV>|<MOD> section())* expr2()

enter image description here

答案 1 :(得分:1)

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

是的,Lars有一个解决方案,但这是一个有趣的选择:

  brush.WrapMode = WrapMode.TileFlipXY;

这可以确保渐变在开始时不必重新绘制但在两个方向上反转,因此额外的像素以正确的颜色绘制而您不需要操纵一个两个Rectangle尺寸..

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

(*)这就是无法使用它来绘制1x1平方/像素的原因。相反,您需要使用FillRectangle ..