GDI+ DrawLines使用宽度大于1的Pen时出现绘制异常
GDI+ DrawLines 绘制异常问题排查
以下是测试代码:
Graphics g(hdc); Pen pen1(Color(0, 0, 0), 1.0f); pen1.SetAlignment(PenAlignmentCenter); Pen pen10(Color(0, 0, 0), 10.0f); pen10.SetAlignment(PenAlignmentCenter); std::vector<Point> line1; line1.push_back({ 100, 100 }); line1.push_back({ 100, 70 }); line1.push_back({ 101, 100 }); g.DrawLines(&pen1, line1.data(), line1.size()); std::vector<Point> line2; line2.push_back({ 200, 100 }); line2.push_back({ 200, 70 }); line2.push_back({ 201, 100 }); g.DrawLines(&pen10, line2.data(), line2.size()); for (std::size_t i = 0; i < line2.size(); ++i) { line2[i].X += 100; } for (std::size_t i = 1; i < line2.size(); ++i) { g.DrawLine(&pen10, line2[i - 1], line2[i]); }
运行后出现异常绘制结果(网格、绿色数字及线条为手绘标注):
- 图(1):参考标尺,展示Y值70的位置
- 图(2):绘制缺陷,线条偏离预期位置
- 图(3):使用相同数据循环调用DrawLine时绘制正常
请问这是GDI+ DrawLines的bug,还是我对其预期行为存在误解?
相关信息:
- 此问题关联此前的Stack Overflow提问,问题与PointF无关,仅涉及DrawLines及Pen宽度
- 运行环境:Windows 10.0.19044.1889;SDK版本10.0.26100.0
更新
生成的GDI+图元文件显示代码应有的正确绘制结果:
这是GDI+ DrawLines的绘制bug。当使用宽度大于1的画笔调用DrawLines绘制折线时,折线连接点的计算逻辑存在偏差,导致线条偏离预期位置;而循环调用DrawLine时,每段直线独立绘制,不会触发连接点的异常计算逻辑,因此结果正常。GDI+图元文件能正确渲染也佐证了这一点——图元文件的渲染路径处理逻辑与即时绘制不同,避开了该bug。
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

