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

标签 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关于窗口创建。

我怎么了?

编辑 :

如果我改变 DPI 意识 在 Visual Studio 中发送至 每台显示器高 DPI 感知 那么窗口真的是800*600,但是看起来很小。它应该是 1000*750 因为 Windows 设置中的缩放因子是 125%

最佳答案

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

主要问题是,SDL2.0.7 在 Windows 上没有正确支持 HighDPI。 2017年5月,他们prepared一个更大的补丁,但它是 merged 2018年2月,所以在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 上查询每个监视器的 DPI 值并从中计算出大小。

由于您使用的是带有延迟着色的 OpenGL:确保您正在设置 glViewPort每个渲染 channel 都正确。

关于window - 如何确定 Windows 10 上窗口的正确可绘制大小? (SDL2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979639/

相关文章:

python - 从 python 脚本自动关闭输出窗口

javascript - 如何在没有像素模糊的情况下调整 html5 Canvas 大小

c++ - 看不到文件 'SDL2.lib'

c++ - SDL2 可以用 C 语言(相对于 C++)编程吗?

c - 如何将对话框置于主程序窗口位置的中心?

html - 在新选项卡或窗口中打开链接

R:调整 ggplot2 中的比例颜色渐变

c++ - SDL_Surface 拒绝 blit

java - ZK中动态初始化窗口

reactjs - 使用fabricjs中的所有对象调整/缩放整个 Canvas ,而不会损失质量