【发布时间】:2015-10-09 02:50:53
【问题描述】:
我遇到了一个问题,即我正在为一个不支持 dpi 的进程进行编码,直到修复错误为止。
所以现在我需要解决这个问题。我的想法是:找出放大系数,然后将元素的宽度/高度缩小这么多。
所以现在我正在绘制第二个显示器的全宽和全高的画布,它是1920 x 1080 (WxH)。但从视觉上看(在屏幕截图后由 Photoshop 测量)它是2880 x 1620。这是 1.5 的放大倍数(2880 除以 1920 或 1620 除以 1080)。
我尝试使用 GetDeviceCaps 和 EnumDisplaysettings 的方法获取 dpi,但它们都返回了主监视器的 dpi(注意:EnumDisplaySettings 设置 dmLogPixels 如果我这样做,我认为 DPI 为 0 EnumDisplaySettings constnat 为ENUM_REGISTRY_SETTINGS,所以我不得不使用ENUM_CURRENT_SETTINGS)。
我发现返回不同的唯一方法是GetDpiForMonitor 与MONITOR_DPI_TYPE constnat 的MDT_Angular_DPI 或MDT_Raw_DPI,如果我使用MDT_Effective_DPI,它会给出主监视器的结果。
所以现在这是我运行GetDpiForMonitor 的结果:
没有一个次要值除以主要值给我一个放大系数 1.5。有没有办法得到这个比例因子?
谢谢
【问题讨论】:
-
感谢@HansPassant!
-
如果 DPI 设置为默认值,@HansPassant 我使用
EnumDisplaySettings的方式很酷。如果用户转到面板并“使文本变大”,它将无法正常工作。所以我想使用你的LogicalToPhysicalPointForPerMonitorDPI函数,但为此它需要hwnd到一个窗口。有没有办法可以将监视器的hmon传递给它?
标签: winapi windows-8.1 resolution