如何在Windows 10上确定窗口的正确可绘制大小? (SDL2)

时间:2017-12-26 14:00:33

标签: window scale sdl-2 highdpi

我正在开发一个OpenGL应用程序。我使用高dpi屏幕,Windows GUI缩放到125%,使程序看起来像常规屏幕。

如果我使用SDL2创建一个800 * 600的窗口,它看起来与常规屏幕相同,但它是1000 * 750像素。由于我使用延迟渲染,我必须创建与可绘制区域大小相同的缓冲区,所以我想找出窗口的实际大小(以像素为单位)

如果我拨打SDL_GL_GetDrawableSize,我会错误地获得800 * 600而不是1000 * 750。 我在窗口创建时添加了标记SDL_WINDOW_ALLOW_HIGHDPI

我错了什么?

修改

如果我将Visual Studio中的 DPI Awareness 更改为 Per Monitor High DPI Aware ,那么该窗口实际上是800 * 600,但它看起来很小。它应该是1000 * 750,因为Windows设置中的缩放系数是125%

1 个答案:

答案 0 :(得分:3)

您的帖子来自2017年12月,而您的SDL版本(2.0.7)则来自2018年1月。您的赏金是最新的,但没有新信息。

主要问题是,SDL2.0.7在Windows上不正确支持HighDPI。在2017年5月,他们prepared发行了一个更大的补丁程序,但在2018年2月是merged,因此是SDL2.0.7版本之后。据我所知,它是在SDL2.0.8中引入的。主要更改是在文件src/video/windows/SDL_windowswindow.c中进行的。我比较了源代码和变更日志。它肯定在上游,但是有人忘记将其写在WhatIsNew.txt中,这很烦人。

我强烈建议将SDL升级到至少2.0.8,最好是2.0.10。

顺便说一句。提到补丁的作者,您需要使用新的提示SDL_HINT_VIDEO_HIGHDPI_ENABLED

在最坏的情况下,如果仍然遇到问题,可以使用GLFW代替SDL。

编辑: 发问者今天提供了新信息。

您可以通过GetDpiForMonitor在Windows上查询每个Monitor的DPI值,并根据该大小进行计算。

由于您使用的是带有延迟着色的OpenGL:请确保为每个渲染过程正确设置glViewPort