【问题标题】:In Win81+ non-dpi aware process, figure out scale factor在 Win81+ 非 dpi 感知进程中,计算比例因子
【发布时间】:2015-10-09 02:50:53
【问题描述】:

我遇到了一个问题,即我正在为一个不支持 dpi 的进程进行编码,直到修复错误为止。

所以现在我需要解决这个问题。我的想法是:找出放大系数,然后将元素的宽度/高度缩小这么多。

所以现在我正在绘制第二个显示器的全宽和全高的画布,它是1920 x 1080 (WxH)。但从视觉上看(在屏幕截图后由 Photoshop 测量)它是2880 x 1620。这是 1.5 的放大倍数(2880 除以 1920 或 1620 除以 1080)。

我尝试使用 GetDeviceCapsEnumDisplaysettings 的方法获取 dpi,但它们都返回了主监视器的 dpi(注意:EnumDisplaySettings 设置 dmLogPixels 如果我这样做,我认为 DPI 为 0 EnumDisplaySettings constnat 为ENUM_REGISTRY_SETTINGS,所以我不得不使用ENUM_CURRENT_SETTINGS)。

我发现返回不同的唯一方法是GetDpiForMonitorMONITOR_DPI_TYPE constnat 的MDT_Angular_DPIMDT_Raw_DPI,如果我使用MDT_Effective_DPI,它会给出主监视器的结果。

所以现在这是我运行GetDpiForMonitor 的结果:

没有一个次要值除以主要值给我一个放大系数 1.5。有没有办法得到这个比例因子?

谢谢

【问题讨论】:

  • 感谢@HansPassant!
  • 如果 DPI 设置为默认值,@HansPassant 我使用EnumDisplaySettings 的方式很酷。如果用户转到面板并“使文本变大”,它将无法正常工作。所以我想使用你的LogicalToPhysicalPointForPerMonitorDPI 函数,但为此它需要hwnd 到一个窗口。有没有办法可以将监视器的hmon 传递给它?

标签: winapi windows-8.1 resolution


【解决方案1】:

我刚刚有了一个想法,它有效我正在使用我的问题中概述的三种方法中的任何一种来获得缩放的高度/宽度:Improper width and height for second monitor from GetMonitorInfo and GetDeviceCaps

  • GetDeviceCaps hdcScreen
  • GetMonitorInfo
  • EnumDisplayMonitors

然后我将它除以EnumDisplaySettings 的宽度/高度。

这是我找到的唯一方法,还有其他方法吗?请高手验证一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多