如何避免GDI +中破碎的虚线?

时间:2012-10-26 09:31:20

标签: c++ mfc drawing line gdi+

从我的MFC应用程序中截取的屏幕截图显示了应该平行的第2行。 2 dashed, parallel lines 2 parallel lines, one solid the other dashed

使用Gdiplus::Graphics::Drawline()绘制线条。

一个小问题是虚线不是直线而是断裂。你注意到了,但这不是什么大问题......

真正的问题是它不一致,用Gdiplus::DashStyleSolid绘制的线条非常直。

这是GDI +中的错误吗?有解决方法吗?

更新1

我尝试制作一个最小的例子,但我很难重现它...... 它可能与非常大的坐标值有关,它们的坐标之间差别很小。 这些是一些示例线坐标:

Line 1: PointF(2.21866e+006, 1.40198e+006), PointF(2.21732e+006, 1.40111e+006)
Line 2: PointF(2.21866e+006, 1.40198e+006), PointF(2.21732e+006, 1.40112e+006)

我注意到起点是相同的,但这可能是由调试输出中的舍入引起的......

更新2

我现在可以重现它: 示例应用程序生成为SDI项目,视图类继承CScrollView(下面的代码和屏幕截图)。 “虚线”效果似乎也与笔的厚度有关。不同厚度的线条略有不同,但我没有找到一直导致平行线的值。

Vincent Porvik在评论中建议这可能是舍入错误的结果,因为Gdiplus::REAL被定义为float。 我相信情况也是如此......

除了在这里使用较小的坐标值外,我还有其他选择吗?

代码和截图

添加/修改了这些函数(除了GDI +初始化代码之外):

void CgdiplusLinesView::OnDraw(CDC* pDC)
{
    CgdiplusLinesDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    pDC->SetBkMode(TRANSPARENT);

    using namespace Gdiplus;
    Graphics g(pDC->m_hDC);
    g.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);

    Pen solidPen(Color(0,0,0), 2.f);
    Pen dashedPen(Color(0,0,0), 2.f);
    dashedPen.SetDashStyle(DashStyleDash);

    g.DrawLine(&dashedPen, PointF(4438749.500000, 2805806.500000), PointF(4434280.500000, 2802106.500000));
    g.DrawLine(&solidPen,  PointF(4438746.500000, 2805809.500000), PointF(4434277.500000, 2802109.500000));
}

void CgdiplusLinesView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
    pDC->SetMapMode(MM_ISOTROPIC);

    const int mapSizePixels = 8388608;
    pDC->SetWindowExt(mapSizePixels, mapSizePixels);
    pDC->SetViewportExt(mapSizePixels, mapSizePixels);
    pDC->SetWindowOrg(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT));

    //__super::OnPrepareDC(pDC, pInfo);
}

void CgdiplusLinesView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    SetScrollSizes(MM_TEXT, CSize(8388608, 8388608), CSize(1361, 1054));
    SetScrollPos(SB_HORZ, 4434897.5);
    SetScrollPos(SB_VERT, 2802645.);
}

crossing lines

1 个答案:

答案 0 :(得分:3)

我不认为这与虚线与实体有关,而是与浮点精度有关。您的坐标似乎是地理坐标。通常的好习惯是将所有坐标存储为双精度,并且当需要使用较低精度的库时,在将所有坐标传递给图形函数之前自己偏移所有坐标。

正确的方法是选择一个接近数据集中点的参考点(您找到的第一个坐标没问题),然后将其坐标减去所有其他点。这使得数值接近0.0,即浮点数具有更高的分辨率密度。