c# - 错误地绘制了应用了 DashStyle 的线条

标签 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 进行了测试。

最佳答案

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

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

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

关于c# - 错误地绘制了应用了 DashStyle 的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385604/

相关文章:

c# - 捕捉/粘性 WPF 窗口

c# - 如何解析不寻常的日期字符串

c# - 从源代码动态创建已编译的 .NET exe?

C# 向组合框添加长字符串

c# - 更改Winforms菜单下拉列表的边框颜色

c# - Xamarin.Mac - 提交到 Mac App Store 的问题

c# - 无法将简单的字符串列表数组绑定(bind)到 ListView

c# - 将对象转换为基本集合

c# - 判断事件窗口是否为 WPF 窗口

c# - 在绑定(bind)时更改 ListBox 的特定项目背景颜色