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
相关产品推荐
相关产品推荐

