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
相关产品推荐
相关产品推荐

