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

Graphics.DrawLine()放入for循环无法正常绘制线条的问题

问题诱因

你的循环逻辑存在两个核心错误,导致线条无法正常渲染:

  • 坐标计算方向完全反了:循环初始值i = panelCenterWidth时,第一次计算得到的x坐标为panelCenterWidth - i = 0,后续i每次递增10,x坐标会变为-10、-20、-30……所有后续线条的x坐标都是负数,全部落在Panel控件的可视客户区外侧,自然无法看到。
  • 循环终止条件存在边界问题:如果panelCenterWidth本身数值大于等于500,i < 500的判断从循环启动时就不成立,整个for循环不会执行任何迭代,完全不会触发绘制操作。

你单独执行myGraphics.DrawLine(myPenMinorAxis, panelCenterWidth - 10, 0, panelCenterWidth - 10, panelHeight);能正常显示,本质是你手动给偏移量赋值了10,线条坐标刚好落在可视范围内,和循环里的错误逻辑没有关系。

修正方案

先明确绘制逻辑:次坐标轴垂直网格线是沿坐标轴中心(x=panelCenterWidth)向左右两侧、每隔固定间隔(这里是10像素)绘制竖线,所有线条的x坐标必须落在0 ~ panelWidth的可视区间内才会显示。
参考修正后的代码如下:

// 绘制中心右侧的次轴垂直网格线
for (int i = 10; i < panelWidth - panelCenterWidth; i += 10)
{
    int lineX = panelCenterWidth + i;
    myGraphics.DrawLine(myPenMinorAxis, lineX, 0, lineX, panelHeight);
}

// 绘制中心左侧的次轴垂直网格线(就是你单独测试的那类线条)
for (int i = 10; i < panelCenterWidth; i += 10)
{
    int lineX = panelCenterWidth - i;
    myGraphics.DrawLine(myPenMinorAxis, lineX, 0, lineX, panelHeight);
}

如果只需要绘制单侧网格线,保留对应循环即可,只要保证计算出的线条坐标在控件可视范围内,就能正常渲染。

内容的提问来源于stack exchange,提问作者David F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:24:15