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

WinForm游戏:如何缩放OnPaint绘制的图形以适配不同分辨率?

适配不同分辨率的WinForm绘制方案

由于你是通过OnPaint手动绘制所有内容,AutoSize属性自然无效——它只对窗体上的控件布局起作用,不会影响你手动绘制的图像。以下是直接适配目标分辨率的可行方案:

核心思路

通过计算源分辨率(2256x1504)与当前窗体客户端区域的缩放比例,在DrawImage时指定缩放后的目标矩形,同时保持画面比例避免拉伸变形。

具体实现步骤

  1. 禁用WinForm自动缩放
    先在窗体构造函数或设计器中设置AutoScaleMode = AutoScaleMode.None,避免系统自动调整绘制坐标干扰自定义缩放逻辑。

  2. 计算缩放比例与绘制参数
    在OnPaint事件中,先获取当前窗体的客户端尺寸,然后计算宽高方向的缩放因子,取较小值保证画面完整显示且比例正确:

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        // 源图像尺寸(你的游戏原生分辨率)
        int sourceWidth = 2256;
        int sourceHeight = 1504;
        // 当前窗体客户端区域尺寸
        int clientWidth = ClientSize.Width;
        int clientHeight = ClientSize.Height;
    
        // 计算宽高缩放比例
        float scaleX = (float)clientWidth / sourceWidth;
        float scaleY = (float)clientHeight / sourceHeight;
        // 取较小的缩放比例,避免画面超出窗体或拉伸变形
        float scaleFactor = Math.Min(scaleX, scaleY);
    
        // 计算缩放后的目标尺寸
        int targetWidth = (int)(sourceWidth * scaleFactor);
        int targetHeight = (int)(sourceHeight * scaleFactor);
    
        // 计算居中绘制的起始坐标(可选,若需要画面居中)
        int startX = (clientWidth - targetWidth) / 2;
        int startY = (clientHeight - targetHeight) / 2;
    
        // 绘制缩放后的图像(假设你的源图像是预先加载的gameImage)
        e.Graphics.DrawImage(gameImage, new Rectangle(startX, startY, targetWidth, targetHeight));
    }
    
  3. 处理窗体大小变化
    当窗体尺寸改变(比如切换分辨率)时,需要触发重绘。在窗体构造函数中添加Resize事件绑定:

    public YourGameForm()
    {
        InitializeComponent();
        AutoScaleMode = AutoScaleMode.None;
        Resize += (s, e) => Invalidate(); // 尺寸变化时强制重绘
    }
    

额外优化建议

  • 如果游戏需要全屏适配1920x1080,可以设置WindowState = FormWindowState.Maximized,同时在OnLoad中获取屏幕分辨率作为目标尺寸(不过用客户端区域更稳妥,避免标题栏占用空间)。
  • 若允许画面拉伸铺满(不保持比例),直接取scaleFactor = Math.Max(scaleX, scaleY)即可,但可能导致画面变形,游戏类应用一般不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:02:32