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

SDL2程序文件名变更致窗口尺寸异常拉伸问题求助

问题描述

Windows 10环境下使用MinGW编译单文件SDL2 C程序(仅依赖SDL2 DLL),出现以下异常:

  • 修改源文件名或编译后的可执行文件名后,原本指定2000×1400像素的窗口会被拉伸为超大全屏窗口
  • 小尺寸窗口(如200×140)无此问题
  • 已尝试更换工作目录、重装SDL2和MinGW,问题未解决

编译命令:

gcc -B "include path" "sourceName.c" -o "sourceName.exe" -lmingw32 -lSDL2main -lSDL2

源代码:

#include <SDL2\SDL.h>
#include <stdbool.h>
#include <stdio.h>

SDL_Renderer* rend;

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
    {
        printf("Error initializing SDL: %s\n", SDL_GetError());
        return 0;
    }
    
    /* Create a window */
    SDL_Window* wind = SDL_CreateWindow("tst",
                                        SDL_WINDOWPOS_CENTERED,
                                        SDL_WINDOWPOS_CENTERED,
                                        2000, 1400, 0);

    if (!wind)
    {
        printf("Error creating window: %s\n", SDL_GetError());
        SDL_Quit();
        return 0;
    }

    /* Create a renderer */
    Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC;
    rend = SDL_CreateRenderer(wind, -1, render_flags);
    if (!rend)
    {
        printf("Error creating renderer: %s\n", SDL_GetError());
        SDL_DestroyWindow(wind);
        SDL_Quit();
        return 0;
    }

    bool running = true;
    SDL_Event event;

    while (running)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
                case SDL_QUIT:
                    running = false;
            }
        }

        SDL_RenderPresent(rend);
    }
}
解决方法

1. 强制SDL2启用高DPI感知

在SDL_Init调用前添加以下代码,让SDL主动处理高DPI缩放:

SDL_SetHint(SDL_HINT_WINDOWS_DPI_AWARENESS, "per-monitor-v2");

2. 给窗口添加高DPI支持标志

修改SDL_CreateWindow的flags参数,加入SDL_WINDOW_ALLOW_HIGHDPI:

SDL_Window* wind = SDL_CreateWindow("tst",
                                    SDL_WINDOWPOS_CENTERED,
                                    SDL_WINDOWPOS_CENTERED,
                                    2000, 1400, SDL_WINDOW_ALLOW_HIGHDPI);

3. 嵌入高DPI manifest文件

创建manifest文件(比如app.manifest),内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
    </windowsSettings>
  </application>
</assembly>

编译时将其嵌入到可执行文件中:

gcc -B "include path" "sourceName.c" -o "sourceName.exe" -lmingw32 -lSDL2main -lSDL2 -Wl,--manifest,app.manifest

4. 手动禁用系统高DPI缩放

找到生成的exe文件,右键→属性→兼容性→更改高DPI设置→勾选“替代高DPI缩放行为”,缩放执行者选择“应用程序”。此方法可快速验证问题根源,但需为每个新文件名的exe重复操作。

原因分析

问题源于Windows的高DPI缩放机制:系统会根据可执行文件名的不同,默认启用不同的缩放策略。当窗口尺寸接近或超过屏幕物理分辨率(经系统DPI缩放换算后),会被强制拉伸为全屏;小尺寸窗口因缩放后仍远小于屏幕,不会触发该行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:44:55