You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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+图元文件中的正确绘制结果


这是GDI+ DrawLines的绘制bug。当使用宽度大于1的画笔调用DrawLines绘制折线时,折线连接点的计算逻辑存在偏差,导致线条偏离预期位置;而循环调用DrawLine时,每段直线独立绘制,不会触发连接点的异常计算逻辑,因此结果正常。GDI+图元文件能正确渲染也佐证了这一点——图元文件的渲染路径处理逻辑与即时绘制不同,避开了该bug。

内容的提问来源于stack exchange,提问作者Damir Tenishev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:03:30