【发布时间】:2015-10-25 05:37:00
【问题描述】:
我通过在清单文件中设置 <dpiAware>True/PM</dpiAware> 使我的应用程序能够识别每个监视器的 dpi。我可以使用进程资源管理器验证这确实有效,或者通过调用 GetProcessDpiAwareness。
这一切都很好,我可以在我的代码中很好地扩展客户区域中的任何内容。但是,我唯一的问题是,如果我将我的应用程序从系统 dpi 监视器拖到非系统 dpi 监视器,标题栏和任何系统菜单都会变得太大或太小。对于大多数内置应用程序(例如 calc、edge browser 等)来说,情况并非如此,因此必须有足够的空间来正确缩放它。有人知道 MS 的开发人员是如何做到这一点的吗?
下面的截图应该能更好地解释我的问题。另请注意,在缩放 (96dpi) 时,关闭、最小和最大按钮之间的填充是不同的。
Sample app 我正在附加一个非常简单的应用程序,它可以识别每个显示器的 dpi。
【问题讨论】:
-
您的每个监视器代码是什么样的? WM_DPICHANGED 的处理程序?
-
您的应用是通用应用吗?计算器和 Edge 都是
-
@melak47 这不是一个通用应用程序。这是一个旧应用程序 - 只是想让它在我所有的显示器上都能正常缩放。如果它是一个通用应用程序,你认为 windows 会缩放标题栏吗?
-
嗯..好的。我不知道你怎么能称之为题外话,但这是我正在使用的off-the-shelf scaffold with the dpi-awareness code。设置 dpi 感知的代码在 wWinMain 中(不在清单中)。 WndProc 也处理 WM_DPICHANGED 但不做任何事情。您可以使用进程资源管理器验证应用程序的 dpi 感知(应用程序也运行自己的验证)
-
好的。 afaik,示例应用程序非常标准,但我希望人们会发现它是相关的。
标签: c++ winapi windows-8.1 dpi windows-10