Visual studio 创建了错误大小的 windows 和错误的系统指标
Visual studio creating wrong sized windows and wrong system metrics
没关系,这个问题是重复的。我也许可以从其他来源弄清楚这一点。
我很困惑。我正在处理我的项目并意识到使用 CreateWindowEx() 创建的 window 比我指定的要大。我注意到 windows 在发布模式下比在调试模式下更大。然后我获取了 GetSystemMetrics(SM_CXSCREEN) 和 SM_CXFULLSCREEN 的值并注意到在调试模式下它给了我 1920 x 1080,这是正确的,但在发布模式下它给了我 1536 x 864.
此外,如果我只是启动一个新的 Win32 项目,它已经启动并准备好 运行 只需按 ctrl + F5,我在调试和发布模式下都会得到错误的值,与以前的值相同, windows 更大。
我看不出提供任何代码有什么帮助,我可以制作一个视频,但是...这没有意义。任何人都可以通过启动一个新的 Win32 项目来查看它是否发生在他们身上,并且看到 1600 x 900 实际上占用了那么多 space?因为 1600 x 900 在不应该占据我的整个屏幕时。
谢谢。
经进一步检查,它给我的 1536 x 864 分辨率是应有尺寸的 80%,或者换句话说,它应该是倒数的 1.25 倍。另外,如果我将桌面分辨率更改为 1600 x 900,指标会显示 1280 x 720,这又是 80%,或者分辨率比给定的大 1.25。
好吧,这是重复的,但如果这对任何人有帮助,我将解释 DPI 缩放的问题。基本上默认的 Windows 设置是 96 DPI。控制面板里有选项"make stuff bigger",这样比较省心。我的滑块设置到中间那个,相当于大 125%,或 120 dpi,这就是系统指标返回错误值的原因,而我的 windows 更大。 dpi 变大,因此系统假定它必须根据放大比例绘制更大的所有内容。如果您认为有人将 window 编程为 200 像素,那么当有人使用超双倍分辨率显示器运行它时,它仍然是 200 像素,但物理尺寸的一半,比如说英寸。因此,通过将 dpi "setting",不是 dpi,而是 dpi "setting" 从 96 加倍到 194,或者将其放大 200%,使得 window 占据 400 个像素,但大小相同相对于原始显示。
无论如何,如果在 Visual Studio 上,最简单的解决方法就是通过项目属性,进入 "manifest" 菜单,然后 select "input/output" ,最后一个选项应该是 DPI Awareness。我的是 "None"。在大多数情况下只需要将其放在 "High DPI Aware" 上即可解决问题。另一个选项 "per monitor DPI awareness" 表示它将以动态方式进行相应调整,例如当应用程序 运行 时更改 dpi 缩放比例,或者将 window 移动到另一个在 运行 时进行监控。高 DPI 感知设置将在启动时进行检查。
有趣的是,如果您转到任何 exe 的属性,在兼容性选项卡下,您可以检查 "Disable display scaling on high DPI settings",这也会起作用。最后,有一个免费程序,现在由 Microsoft 拥有,称为 Process Explorer,它基本上类似于具有额外功能的任务管理器,您可以 select DPI Awareness 列并查看哪些程序是 DPI 感知的。是的,DPI Awareness 是一回事,我觉得很愚蠢。还有很多其他方法可以做到这一点,比如函数调用和合并清单,但我对此一无所知,现在累得喘不过气来。
没关系,这个问题是重复的。我也许可以从其他来源弄清楚这一点。
我很困惑。我正在处理我的项目并意识到使用 CreateWindowEx() 创建的 window 比我指定的要大。我注意到 windows 在发布模式下比在调试模式下更大。然后我获取了 GetSystemMetrics(SM_CXSCREEN) 和 SM_CXFULLSCREEN 的值并注意到在调试模式下它给了我 1920 x 1080,这是正确的,但在发布模式下它给了我 1536 x 864.
此外,如果我只是启动一个新的 Win32 项目,它已经启动并准备好 运行 只需按 ctrl + F5,我在调试和发布模式下都会得到错误的值,与以前的值相同, windows 更大。
我看不出提供任何代码有什么帮助,我可以制作一个视频,但是...这没有意义。任何人都可以通过启动一个新的 Win32 项目来查看它是否发生在他们身上,并且看到 1600 x 900 实际上占用了那么多 space?因为 1600 x 900 在不应该占据我的整个屏幕时。
谢谢。
经进一步检查,它给我的 1536 x 864 分辨率是应有尺寸的 80%,或者换句话说,它应该是倒数的 1.25 倍。另外,如果我将桌面分辨率更改为 1600 x 900,指标会显示 1280 x 720,这又是 80%,或者分辨率比给定的大 1.25。
好吧,这是重复的,但如果这对任何人有帮助,我将解释 DPI 缩放的问题。基本上默认的 Windows 设置是 96 DPI。控制面板里有选项"make stuff bigger",这样比较省心。我的滑块设置到中间那个,相当于大 125%,或 120 dpi,这就是系统指标返回错误值的原因,而我的 windows 更大。 dpi 变大,因此系统假定它必须根据放大比例绘制更大的所有内容。如果您认为有人将 window 编程为 200 像素,那么当有人使用超双倍分辨率显示器运行它时,它仍然是 200 像素,但物理尺寸的一半,比如说英寸。因此,通过将 dpi "setting",不是 dpi,而是 dpi "setting" 从 96 加倍到 194,或者将其放大 200%,使得 window 占据 400 个像素,但大小相同相对于原始显示。
无论如何,如果在 Visual Studio 上,最简单的解决方法就是通过项目属性,进入 "manifest" 菜单,然后 select "input/output" ,最后一个选项应该是 DPI Awareness。我的是 "None"。在大多数情况下只需要将其放在 "High DPI Aware" 上即可解决问题。另一个选项 "per monitor DPI awareness" 表示它将以动态方式进行相应调整,例如当应用程序 运行 时更改 dpi 缩放比例,或者将 window 移动到另一个在 运行 时进行监控。高 DPI 感知设置将在启动时进行检查。
有趣的是,如果您转到任何 exe 的属性,在兼容性选项卡下,您可以检查 "Disable display scaling on high DPI settings",这也会起作用。最后,有一个免费程序,现在由 Microsoft 拥有,称为 Process Explorer,它基本上类似于具有额外功能的任务管理器,您可以 select DPI Awareness 列并查看哪些程序是 DPI 感知的。是的,DPI Awareness 是一回事,我觉得很愚蠢。还有很多其他方法可以做到这一点,比如函数调用和合并清单,但我对此一无所知,现在累得喘不过气来。