SDL2能否在非0号显示器启用SDL_WINDOW_FULLSCREEN真实全屏?
在指定显示器使用SDL2真实全屏模式(SDL_WINDOW_FULLSCREEN)
可以在非0号显示器使用SDL_WINDOW_FULLSCREEN真实全屏模式,并非严格限制只能用0号显示器。你之前遇到的问题是因为没有正确将窗口与目标显示器绑定,导致切换全屏时默认落到0号显示器上。
实现步骤
- 获取目标显示器的显示模式:先通过
SDL_GetNumVideoDisplays()获取系统中显示器的总数,再用SDL_GetDisplayMode(display_index, 0, &mode)获取目标显示器(display_index为目标显示器编号,从0开始)的原生显示模式(第2个参数传0表示获取当前活跃模式)。 - 创建关联目标显示器的窗口:调用
SDL_CreateWindow()时,将窗口位置参数设为SDL_WINDOWPOS_CENTERED_DISPLAY(display_index)或SDL_WINDOWPOS_UNDEFINED_DISPLAY(display_index),同时将窗口初始大小设为目标显示器的分辨率(mode.w和mode.h)。 - 切换到真实全屏:先调用
SDL_SetWindowDisplayMode(window, &mode)将窗口的显示模式与目标显示器匹配,再执行SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN)即可在目标显示器进入真实全屏。
关于两种全屏模式的疑问
SDL_WINDOW_FULLSCREEN_DESKTOP是伪全屏,本质是窗口铺满屏幕,不需要修改显示器的视频模式,所以只要窗口初始在目标显示器上,就能直接铺满该屏幕,无需额外绑定操作。而真实全屏模式需要让SDL知道要修改哪个显示器的视频模式,因此必须先将窗口与目标显示器关联,这就是两者使用方式不同的原因,并非真实全屏只能限制在0号显示器。
Windows平台注意事项
Windows下如果指定的显示模式不被目标显示器支持,SDL可能会 fallback 到0号显示器,因此建议优先使用目标显示器的原生模式来设置窗口,避免出现模式不兼容的问题。
内容的提问来源于stack exchange,提问作者Sander
相关产品推荐
相关产品推荐

