从我的MFC应用程序中截取的屏幕截图显示了应该平行的第2行。
使用Gdiplus::Graphics::Drawline()
绘制线条。
一个小问题是虚线不是直线而是断裂。你注意到了,但这不是什么大问题......
真正的问题是它不一致,用Gdiplus::DashStyleSolid
绘制的线条非常直。
这是GDI +中的错误吗?有解决方法吗?
我尝试制作一个最小的例子,但我很难重现它...... 它可能与非常大的坐标值有关,它们的坐标之间差别很小。 这些是一些示例线坐标:
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)
我注意到起点是相同的,但这可能是由调试输出中的舍入引起的......
我现在可以重现它: 示例应用程序生成为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.);
}
答案 0 :(得分:3)
我不认为这与虚线与实体有关,而是与浮点精度有关。您的坐标似乎是地理坐标。通常的好习惯是将所有坐标存储为双精度,并且当需要使用较低精度的库时,在将所有坐标传递给图形函数之前自己偏移所有坐标。
正确的方法是选择一个接近数据集中点的参考点(您找到的第一个坐标没问题),然后将其坐标减去所有其他点。这使得数值接近0.0,即浮点数具有更高的分辨率密度。