You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C# Windows Form应用中实现窗体Resize时随机绘制图形?

解决C# WinForm窗体调整大小时随机绘制图形的问题

我来帮你搞定这个问题~先梳理下你现有代码的核心问题,再给出可行的解决方案:

现有代码的关键问题

  1. 循环提前终止:多层嵌套循环里加了多个break,导致循环只执行一次,自然只能看到单个图形或固定组合,根本没遍历整个窗体宽度。
  2. 随机尺寸不一致:后来尝试的代码中,每次调用n.Next(50)都会生成新的随机数,导致矩形和椭圆的高度不一样;再加上break限制,还是只绘制了一个图形。

正确实现思路

推荐把绘制逻辑放在窗体的Paint事件里——窗体大小调整、重绘(比如最小化还原)时都会自动触发这个事件,不用手动处理Resize。同时注意:

  • 随机数生成器要定义在类级别,不要在循环里每次新建,不然短时间内会生成重复的随机数。
  • 固定图形的宽高(或提前把随机尺寸存到变量里),保证同位置的矩形、椭圆尺寸一致。

完整代码示例

首先在窗体类里定义全局的随机数生成器:

private Random _random = new Random();

然后在窗体的Paint事件中编写绘制逻辑(可以在设计器里双击窗体的Paint事件自动生成方法):

private void YourFormName_Paint(object sender, PaintEventArgs e)
{
    Graphics desen = e.Graphics;
    // 定义不同颜色的画笔,区分图形
    Pen redPen = new Pen(Color.Red, 2);
    Pen bluePen = new Pen(Color.Blue, 2);

    // 配置图形基础参数
    int startX = 17;
    int startY = 25;
    int shapeSize = 25; // 固定宽高,保证图形尺寸一致
    int spacing = 50; // 每个图形之间的横向间距

    // 遍历窗体宽度,依次绘制随机图形
    for (int currentX = startX; currentX < this.Width; currentX += spacing)
    {
        // 随机选择绘制类型:0=矩形,1=椭圆,2=同时绘制两者
        int shapeType = _random.Next(3);
        
        switch (shapeType)
        {
            case 0:
                desen.DrawRectangle(redPen, currentX, startY, shapeSize, shapeSize);
                break;
            case 1:
                desen.DrawEllipse(bluePen, currentX, startY, shapeSize, shapeSize);
                break;
            case 2:
                desen.DrawRectangle(redPen, currentX, startY, shapeSize, shapeSize);
                desen.DrawEllipse(bluePen, currentX, startY, shapeSize, shapeSize);
                break;
        }

        // 绘制分隔线(和你原代码逻辑一致)
        desen.DrawLine(bluePen, currentX + spacing - 20, 0, currentX + spacing - 20, startY);
    }

    // 释放画笔资源,避免内存泄漏
    redPen.Dispose();
    bluePen.Dispose();
}

额外优化提示

如果想让图形高度随机,但保证同位置的矩形和椭圆高度一致,可以先把随机值存到变量里再使用:

int randomHeight = _random.Next(20, 60); // 生成20-60之间的随机高度
desen.DrawRectangle(redPen, currentX, startY, shapeSize, randomHeight);
desen.DrawEllipse(bluePen, currentX, startY, shapeSize, randomHeight);

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

火山引擎 最新活动