具有应用的DashStyle的行被错误地绘制

时间:2011-12-05 12:53:14

标签: c# .net winforms

做一些GIS编程我偶然发现了以下奇怪的问题: 当我将具有相当大的变换值的变换矩阵应用于Graphics对象,然后从A点到B点绘制一条线时,只要我将DashStyle应用于使用过的Pen对象,就会将其绘制为弯曲。

以下是一些示例代码:

protected override void OnPaint( PaintEventArgs e ) {
    base.OnPaint( e );
    Graphics g = e.Graphics;
    g.Clear( Color.White );
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    Matrix m = new System.Drawing.Drawing2D.Matrix();
    m.Reset();
    m.Translate( -1520106.88f, -6597594.5f, MatrixOrder.Append );
    m.Scale( 0.393068463f, -0.393068463f, MatrixOrder.Append );
    g.Transform = m;
    g.TranslateTransform( 0, 400 );

    Pen p1 = new Pen( Color.Green, 8.0f );
    Pen p2 = new Pen( Color.Magenta, 7.0f );

    PointF[] roadLine = new PointF[2];
    roadLine[0] = new PointF( 1520170.13f, 6596633.0f );
    roadLine[1] = new PointF( 1521997.38f, 6596959.0f );

    // Normal (solid line)
    g.DrawLines( p1, roadLine );
    g.DrawLines( p2, roadLine );

    g.TranslateTransform( 0, -200 );

    //Dashed
    g.DrawLines( p1, roadLine );
    p2.DashStyle = DashStyle.Dash;
    g.DrawLines( p2, roadLine );

    g.TranslateTransform( 0, -200 );

    //Dashed
    g.DrawLines( p1, roadLine );
    p2.DashStyle = DashStyle.DashDot;
    g.DrawLines( p2, roadLine );

    g.TranslateTransform( 0, -200 );

    //Dash-Dot-Dot
    g.DrawLines( p1, roadLine );
    p2.DashStyle = DashStyle.DashDotDot;
    g.DrawLines( p2, roadLine );
}

如果您将其放入新的Windows窗体应用程序并运行它,您将看到一些实线和一些虚线(具有不同的破折号样式)。我希望虚线完全覆盖相应的实线,但它们不会。

请注意,绿色,实线和虚线都使用A点和B点的坐标。

这是预期的行为,还是应该将其报告为.NET错误?

我使用Visual Studio 2008和.NET 2.0以及.NET 3.5进行了测试。

1 个答案:

答案 0 :(得分:2)

是的,这是一个错误。你应该举报吗?我不认为微软会对此采取任何措施。

您可以尝试更改图形例程,尝试不按比例工作,或者只是避免使用DashStyle属性。设置自己的DashPattern也无法解决问题。

认为 WPF会更好地处理这种情况,因为它是基于矢量的,而不是基于像素的。