C# WinForms绘制网格超出屏幕问题求助(蛇形游戏开发)
问题修复方案
核心问题分析
- 错误使用窗体整体
Height(包含标题栏、边框)计算单元格数量,而非客户区(可绘制区域)的实际尺寸 - 绘制线条的终点超出客户区范围,导致部分内容被屏幕截断
- 默认Pen为居中绘制模式,边缘线条会有一半处于客户区外,无法正常显示
修复后的代码
private void Form1_Paint(object sender, PaintEventArgs pe) { float cellSize = 20.0F; // 计算客户区能容纳的完整单元格数量(向下取整,避免超出屏幕) int numCellsX = (int)Math.Floor(this.ClientSize.Width / cellSize); int numCellsY = (int)Math.Floor(this.ClientSize.Height / cellSize); Graphics g = pe.Graphics; // 设置Pen为内部对齐,确保边缘线条完全显示在客户区内 using Pen blackPen = new Pen(Color.Black, 1) { Alignment = PenAlignment.Inset }; // 绘制垂直线 for (int i = 0; i <= numCellsX; i++) { float x = i * cellSize; g.DrawLine(blackPen, x, 0, x, this.ClientSize.Height); } // 绘制水平线 for (int i = 0; i <= numCellsY; i++) { float y = i * cellSize; g.DrawLine(blackPen, 0, y, this.ClientSize.Width, y); } }
关键修改点
- 切换为客户区尺寸:用
ClientSize.Width和ClientSize.Height替代窗体整体尺寸,确保绘图范围限定在可显示区域内 - 计算合理单元格数量:通过
Math.Floor得到宽、高方向能放下的完整单元格数,避免绘制超出屏幕的内容 - 调整Pen对齐方式:设置
PenAlignment.Inset让线条向内部绘制,解决边缘线条被截断的问题 - 修正循环范围:循环到
<= numCellsX/Y,确保绘制出最右侧和最底部的边缘线条
内容的提问来源于stack exchange,提问作者ThisQRequiresASpecialist
相关产品推荐
相关产品推荐

