【问题标题】:ID2D1RenderTarget::GetSize returing physical pixels instead of DIPID2D1RenderTarget::GetSize 返回物理像素而不是 DIP
【发布时间】:2019-09-13 18:51:50
【问题描述】:

我目前是 getting started with Win32 和 Direct2D 并已到达 chapter on DPI and DIP。在最底部,它说ID2D1RenderTarget::GetSize 以 DIP 形式返回大小,ID2D1RenderTarget::GetPixelSize 以物理像素形式返回。他们的个人文件证实了这一点。 但是我无法观察到ID2D1RenderTarget::GetSize 实际上返回 DIP。

我测试过

  1. 将我的两个其他相同显示器之一的比例设置为 175%,
  2. <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> 添加到我的应用程序清单中,
  3. 获得

    D2D1_SIZE_U sizeP = pRenderTarget->GetPixelSize();
    D2D1_SIZE_F size = pRenderTarget->GetSize();
    

    在来自this 示例的方法MainWindow::CalculateLayout 中(并打印值),

  4. 并将窗口从一个屏幕移动到另一个屏幕,并任意调整其大小。

当从一个显示器移动到另一个显示器时,我可以看到窗口边框的大小发生变化。但是,sizePsize 中的值(除了 int 和 float)总是相同的,并且对应于 ID2D1HwndRenderTarget物理 大小。

由于我不希望文档有缺陷,我想知道我缺少什么才能真正获得ID2D1HwndRenderTargetpRenderTarget 的窗口的 DIP。

【问题讨论】:

    标签: winapi dpi direct2d


    【解决方案1】:

    大小仅与渲染目标的 DPI 相关,使用 ID2D1RenderTarget::SetDpi 设置。该值不会自动连接到显示系统提供的值,可以使用ID2D1Factory::GetDesktopDpiGetDpiForMonitor查询。

    【讨论】:

    • 谢谢。我现在用FLOAT dpi = (FLOAT) GetDpiForWindow(m_hwnd); pRenderTarget->SetDpi(dpi, dpi);WM_DPICHANGED 做出反应。显然,ID2D1Factory::GetDesktopDpi 已被弃用,而应在桌面应用程序中使用 GetDpiForWindow
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2012-03-28
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多