Winforms .Net绘图剪辑错误

Winforms .Net绘图剪辑错误,winforms,graphics,gdi+,system.drawing,Winforms,Graphics,Gdi+,System.drawing,GDI+DrawLines函数有一个剪辑错误,可以通过运行以下c#代码来复制。运行代码时,会出现两条线路径,这两条线路径应该相同,因为它们都位于剪裁区域内。但当设置剪裁区域时,不会绘制其中一条线段 protected override void OnPaint(PaintEventArgs e) { PointF[] points = new PointF[] { new PointF(73.36f, 196), new PointF(75.44f, 32),

GDI+DrawLines函数有一个剪辑错误,可以通过运行以下c#代码来复制。运行代码时,会出现两条线路径,这两条线路径应该相同,因为它们都位于剪裁区域内。但当设置剪裁区域时,不会绘制其中一条线段

protected override void OnPaint(PaintEventArgs e)
{
   PointF[] points = new PointF[] { new PointF(73.36f, 196), 
             new PointF(75.44f, 32), 
             new PointF(77.52f, 32), 
             new PointF(79.6f, 196), 
             new PointF(85.84f, 196) };

   Rectangle b = new Rectangle(70, 32, 20, 164);         
   e.Graphics.SetClip(b);
   e.Graphics.DrawLines(Pens.Red, points); // clipped incorrectly
   e.Graphics.TranslateTransform(80, 0);
   e.Graphics.ResetClip();
   e.Graphics.DrawLines(Pens.Red, points);
 }
在图形对象上设置antials模式可以解决此问题。但这不是真正的解决办法


有人知道解决方法吗?

代码出现了什么问题

好的,问题应该是。。。代码应该做什么,但它还没有做

当我运行代码时,我看到两个红色的“尖峰”我不知道吗

您似乎在剪切矩形区域内绘制了第一个尖峰,通过在矩形声明后添加以下内容进行验证:

e.Graphics.FillRectangle(新的SolidBrush(颜色为黑色),b)


然后执行平移,重置剪辑,因此在这一点上,我假设clientRectangle被用作适当的剪辑区域,然后尝试重绘平移的尖峰。虫子在哪里

错误在于,两条线段应绘制相同,但它们不是相同的,因为在剪裁区域内绘制的尖峰完全在剪裁区域内,不应以任何方式进行剪裁,但实际上是相同的。这是一个非常烦人的问题,但这会导致任何使用抽绳+剪裁的软件看起来不专业,因为多边形中可能会出现间隙。

这似乎是一个已知的错误

以下代码将按照您的要求运行:

protected override void OnPaint(PaintEventArgs e)
    {
        PointF[] points = new PointF[] { new PointF(73.36f, 196), 
         new PointF(75.44f, 32), 
         new PointF(77.52f, 32), 
         new PointF(79.6f, 196), 
         new PointF(85.84f, 196) };

        e.Graphics.SmoothingMode =  System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        Rectangle b = new Rectangle(70, 32, 20, 165);
        e.Graphics.SetClip(b);
        e.Graphics.DrawLines(Pens.Red, points); // clipped incorrectly
        e.Graphics.TranslateTransform(80, 0);
        e.Graphics.ResetClip();           
        e.Graphics.DrawLines(Pens.Red, points);
    }
注意:我已经对线条进行了反锯齿处理,并将剪切区域扩展了1

以下解决方法可能会有所帮助(尽管未经测试):

  • 这支笔的厚度超过一个像素
  • 这条线是完全水平或垂直的
  • 剪裁是针对窗口边界而不是剪裁矩形进行的
下面列出了可能/或者可能同样没有帮助的文章:

或者

以下也是可能的:

protected override void OnPaint ( PaintEventArgs e )
    {
        PointF[] points = new PointF[] { new PointF(73.36f, 196), 
         new PointF(75.44f, 32), 
         new PointF(77.52f, 32), 
         new PointF(79.6f, 196), 
         new PointF(85.84f, 196) };

        Rectangle b = new Rectangle( 70, 32, 20, 164 );
        Region reg = new Region( b );
        e.Graphics.SetClip( reg, System.Drawing.Drawing2D.CombineMode.Union);
        e.Graphics.DrawLines( Pens.Red, points ); // clipped incorrectly
        e.Graphics.TranslateTransform( 80, 0 );
        e.Graphics.ResetClip();
        e.Graphics.DrawLines( Pens.Red, points );
    }
这将有效地使用一个与画布/控件的ClientRectangle组合/联合(我认为)的区域进行剪辑。由于区域与矩形不同,因此结果应该是预期的结果。通过添加

e.Graphics.FillRectangle( new SolidBrush( Color.Black ), b );
在setClip()调用之后。这清楚地显示了仅出现在剪裁区域中的黑色矩形

如果线的抗锯齿不是一个选项,这可能是一个有效的解决方法

希望这有帮助