问题标签 [hidpi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
113 浏览

winforms - 如何触发 WinForms DpiChanged 事件?

(不,我还不能将此代码库升级到 .NET Core 或更高版本。)

我有一个主要是 Windows 窗体和部分 WPF 的应用程序。当字体大小在运行时发生变化时,WPF 会做出正确反应。相反,除非我重新启动,否则 Windows 窗体似乎甚至没有意识到任何改变。例如,属性Control.DeviceDpi直到 4.7 才引入)显示启动时准确的值,而不是当前值。

我的app.manifest有:

我的app.config有:

但是 4.7确实引入了一个Control.DpiChanged事件,只是它似乎永远不会触发。

但是,如果我覆盖WndProc并收听WM_DPICHANGED,那确实会触发。此代码似乎表明该事件应该触发。

显然,这不是因为这段代码有条件地将其关闭。但我不确定我不符合哪个部分的资格。(我在 Windows 10 21H1 上,比 RS2 更新。)

0 投票
1 回答
94 浏览

windows - LoadCursor 和混合 DPI 多显示器

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

即:通常:

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

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

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

有没有办法以编程方式创建一个游标,该游标根据显示在哪个监视器上动态切换?加载的光标以不同的方式工作在幕后发生了什么魔力LoadCursor

0 投票
0 回答
261 浏览

x11 - .Xresources 中 Xft.dpi 的最佳值是多少

来自Arch Wiki

对于 Xft.dpi,使用 96 的整数倍通常效果最好,例如 192 用于 200% 缩放。

我知道 200%、300%、... 缩放是最好的,因为每个像素都替换为整数像素,而且我们没有需要显示 1.5 个像素的情况。

但是如果没有 4k 显示器,并且有例如2.5k(2560x1440) 显示器或具有一些非标准分辨率或纵横比的显示器,该怎么办。在这种情况下,将比例因子增加 2 倍太多了。

我只有两个想法:

  • 将其缩放为1.25, 1.5, , 以便正确缩放具有和大小1.75的对象。16x1632x32
  • 将其缩放(vertical_pixels*horizontal_pixels)/(1920*1080)*96,因此您将获得类似于正常显示的对象大小。
0 投票
0 回答
29 浏览

c# - 在 MFC 本机应用程序中启用 WindowsFormsHighDpiAutoResizing

启用了 CLR 支持的 MFC 应用程序 (.net framework 4.7.2) 引用了包含 WinForms 控件的 ac# 程序集。这些控件使用 Control.DeviceDpi,但在运行时此 api 始终返回 96。

使用 EnableWindowsFormsHighDpiAutoResizing 添加 MFCApplication.exe.config 可解决该问题。Control.DeviceDpi 报告准确的 dpi。

有没有办法将此 .config 嵌入到 MFCApplication.exe 中?或者这个标志可以在启动时以编程方式设置吗?在这方面有一些最佳实践吗?

0 投票
1 回答
67 浏览

c++ - wxWidgets 3.1.5 MSW - HiDPI 缩放问题导致控件大小不正确

关于我的设置的信息

  • wxWidgets:3.1.5(也尝试了来自github的最新源)
  • wxWidgets:在 msys2 (ucrt64) 下使用 gcc-11.2 构建
  • Windows 10 应用程序:在 msys2 (ucrt64) 下使用 gcc-11.2 构建
  • 监控原生分辨率:3840 x 2160
  • IDE:Eclipse 2021-09

我的问题

如果我构建我的应用程序并链接到一个没有使用 HiDPI 感知清单的资源文件,那么一切正常,但是正如人们所期望的那样,字体是像素化的。但是,一旦我与 HiDPI 感知资源文件链接,则控件的大小不会与其关联的文本成比例地调整。请参阅以下屏幕截图。

非 hidpi 感知资源文件 - 以 200% 缩放

上图显示了在没有 HiDPI 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 200%。如您所见,wxFrame 已正确渲染。

非 hidpi 感知资源文件 - 缩放 350%

上图显示了在没有 HiDPI 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 350%。如您所见,(除了模糊的文本)wxFrame 已正确渲染。

hidpi 感知资源文件 - 以 200% 缩放

上图显示了使用HiDPI 感知资源文件渲染的测试 wxFrame。监视器缩放比例为 200%。如您所见,wxFrame 渲染得很糟糕。这个 wxFrame 以 100% 的比例正确渲染。

这是一个最小的功能齐全的代码示例来演示我的问题。

对 SetMinSize() 和 SetMaxSize() 的调用对我的整体 UI 设计至关重要。

我使用以下内容构建了 wxWidgets 资源文件:

windres --use-temp-file -ires.rc -ores.o -I/home/user/resource -DwxUSE_DPI_AWARE_MANIFEST=2

然后,我在构建应用程序时将生成的目标文件传递给链接器。

重要的是要补充一点,我的应用程序可以在 wxWidgets/GTK3 (Linux) 和 wxWidgets macOS/Cocoa 上正确呈现。也就是说,它可以在 macOS 和 Linux 上以任何比例值正常工作(没有像素化字体)。

当我在 Windows 10 上使用 HiDPI 感知资源文件时,是否有人知道为什么我的应用程序无法正确呈现?