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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:20:54