【问题标题】:LoadCursor and Mixed DPI Multiple MonitorsLoadCursor 和混合 DPI 多显示器
【发布时间】:2021-10-18 23:11:37
【问题描述】:

LoadCursor 函数用于从资源加载游标时,生成的HCURSOR 可以在不同的监视器上使用,并且始终以正确的大小显示。

即:通常:

  • 在 96 dpi 显示器上使用 32x32 资源,
  • 在 192 dpi 显示器上使用 64x64 资源。

但是,当游标是从内存中以编程方式创建时(比如使用LookupIconIdFromDirectoryExCreateIconFromResourceEx),生成的游标具有固定的分辨率。这意味着它在混合 DPI 多显示器设置中的至少一台显示器上显示为错误的尺寸。

我还检查了LoadCursorFromFile,它也提供了这种动态分辨率行为,例如LoadCursor

有没有办法以编程方式创建一个游标,该游标根据显示在哪个监视器上动态切换?加载了LoadCursor 的游标在幕后发生了什么神奇的事情?

【问题讨论】:

    标签: windows winapi hidpi


    【解决方案1】:

    经过大量实验,我终于发现,如果使用 scaleWithDpi 选项,WPF 可以从资源和内存流中加载游标并获得正确的 DPI 行为:

    public Cursor(Stream cursorStream, bool scaleWithDpi)
    

    查看参考源,它最终出现在函数LoadFromStream 中,该函数通过将流写入临时文件并从文件中加载来加载流。 See source

    总结一下:

    • 似乎获得像这样的动态 DPI 光标的唯一方法是使用 Win32 本机资源加载函数和从文件加载。您似乎无法通过这种行为直接从内存中加载游标。
    • 此行为的“动态 dpi”部分似乎与传递给 LoadImage 函数的 LR_DEFAULTSIZE 标志有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2013-09-10
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多