问题标签 [highdpi]

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 回答
274 浏览

winapi - 如何使用物理坐标设置窗口位置和设置窗口位置

我的应用程序是多 DPI 感知的,当我们调用SetWindowPosor时SetWindowPlacement,我们使用为适当的监视器计算的矩形来执行此操作。但是,这些函数似乎假定提供的大小是针对当前DPI 的,并对其进行缩放。更糟糕的是,在 期间WM_CREATE,它不WM_GETDPISCALEDSIZE用于缩放大小,而只是线性缩放,因此我们无法校正大小。

有没有办法强制SetWindowPosSetWindowPlacement完全使用提供的窗口大小(在未缩放的坐标中)?

0 投票
1 回答
203 浏览

windows - 如何在 DialogBox 对话框上调用 EnableNonClientDpiScaling?

在不支持 Per-Monitor v2 的系统上,如何在DialogBox对话框中启用 DPI 缩放的非客户区?

您应该打电话EnableNonClientDpiScalingWM_NCCREATE但此消息不会发送到DialogBox对话框!

0 投票
0 回答
491 浏览

windows - Windows 7 - 高 DPI - RAD Studio XE7 的 SetProcessDPIAware 问题?

我正在使用 Embarcadero RAD Studio C++ Builder XE7 在 Windows 7 系统上开发应用程序。我正试图让我的应用程序 DPI 之一知道。为此,我需要重现以下行为之一:

  • 停止所有类型的 DPI 感知,让应用程序保持相同大小,无论选择什么 DPI
  • 允许 Windows 虚拟化应用程序(AFAIK 这是默认行为)
  • 通过在我的应用程序的每个表单上启用 TForm Scaled 属性,通知 Windows 应用程序可识别 DPI,并让应用程序调整其组件的大小。

使用清单文件,我可以在我的应用程序中完美地重现这 3 个场景。

但是,我想在运行时从应用程序本身内部选择应用程序的行为方式。例如,我想使用如下命令行打开我的应用程序:

C:> MyApp.exe /DPIBehavior=[忽略,虚拟化,缩放]

我注意到 Windows SDK 提供了几个函数来实现这一点。由于我仍在 Windows 7 上开发,我无法使用或测试 SetProcessDPIAwareness() 函数,因为在 Windows 8.1 之前不可用,所以我尝试使用 SetProcessDPIAware() 函数。

我注意到这个功能很好地停止了 Windows 虚拟化过程。但是,即使我的表单属性上的 Scaled 属性设置为 true,我的表单也不再缩放。我在这里指定我编译了我的应用程序的 2 个不同版本,一个在主窗体上启用了 Scaled 属性,另一个没有,但两者都尽快调用 SetProcessDPIAware() 函数。

我在 192 dpi 下测试了这些应用程序版本。由于它们产生完全相同的结果,即完全相同大小的用户界面,我推断使用 SetProcessDPIAware() 函数时缩放不起作用。另一方面,当我使用清单而不是调用 SetProcessDPIAware() 函数来运行完全相同的应用程序时,我得到了预期的结果:一个应用程序被缩放,另一个没有。

谁能向我解释如何在保持 TForm 缩放的同时使用 SetProcessDPIAware() 函数?或者它是一个 XE7 错误?

0 投票
1 回答
746 浏览

delphi - Delphi 高 DPI 组件

我有一个关于 Delphi 中的高 DPI 应用程序的问题。在 Internet 上冲浪 我发现了 Žarko Gajić 发表的一系列文章。这些文章谈到了为 High-DPI 创建 Delphi 应用程序。该方法描述工作正常,但是作者在每个应用程序中都使用它;例如谈论 TSpeedButtons。

我的问题是:有没有办法将这种行为也实现到组件中?例如,我正在实现一个与 Embarcadero TSpeedButton 类似但使用透明 PNG 图像的简单组件。组件内的图像是在设计时从一些 PNG 图像加载的。我有一个 TObjectDictionary,在其中注册按钮状态:启用、禁用等。它是这样声明的:

在使用此组件的应用程序中,我从 24 x 24 像素的文件中加载 PNG 图像。当我在 4K 显示器上执行应用程序时,这些图像变得非常小。如果我应用 Žarko 方法一切正常,但这样每个应用程序都需要使用我的组件来实现此解决方案。

如何直接在组件内部实现?我想在SetGlyph过程中实现它,就像下面的代码,但我不知道这是否是正确的地方。

TGlyphState 是这样定义的:

爱神

0 投票
1 回答
614 浏览

delphi - 使用 PNG 图标缩放 TImageList 以实现高 DPI 模式

我想让 HeidiSQL 具有高 dpi 意识,其中包括升级我的一个 TImageList ,其中包含许多 alpha 透明的 PNG 图标。

我已经烘焙了一个程序,但是它破坏了正常的透明度和 alpha 透明度,所以图标看起来很破碎,特别是在它们的边缘:

在此处输入图像描述

这是代码:

我还尝试了来自 Žarko Gajić 的一些代码,但这确实只是消除了图像的透明度,即使没有实际缩放。

Paint.net 对其图标进行了很好的缩放,但它是用 C# 编写的,所以这无济于事:

在此处输入图像描述

0 投票
2 回答
486 浏览

winapi - 在支持 Windows 8.1 的应用程序上缩放非客户区以支持每台显示器的高 DPI

我正在开发一个在 Windows 10 和 8.1 上运行的应用程序,并且在具有不同 DPI 的显示器之间移动时遇到了缩放非客户区(菜单栏、标题栏)的问题。客户区得到处理,但非客户区不成比例。DPI Awareness 设置为 PerMonitorAware(v1,因为 v2 在 Windows 8.1 上不可用)。

EnableNonClientDpiScaling 函数完全符合我的需要(它是所有类似问题的公认答案) - 可惜它只是 Windows 10 上 API 的一部分。

有没有办法在没有前面提到的功能的情况下手动处理这个 - 为了保持对 Windows 8.1 的支持?或者支持 Windows 8.1 是否意味着在具有不同 DPI 的屏幕之间移动时无法调整非客户区的大小?

0 投票
0 回答
455 浏览

delphi - How to disable high dpi support on Windows 7?

I have an older application for which I want to use DPI virtualization on Windows 7 (also known as blurry form scaling). To try this in an example project, I did the following:

  • enable 125 % text display on a Windows 7 machine
  • disabled any manifest for that project
  • read Monitor.PixelsPerInch with a result of 120

I tried some things, but I was unable to get a result of 96 dpi here:

  • used <dpiAware>false</dpiAware> in an internal or external supplied manifest
  • changed application compatibility settings
  • changed windows theme

I additionaly thought that SetProcessDPIAware is called somwhere in the VCL. I found System.win.HighDpi which contains SetProcessDPIAware in its initialization block, but this unit is not included in my minimal sample.

Sample manifest (setting dpiAware seems to be ignored):

0 投票
1 回答
99 浏览

wpf - 在 WPF 中获取所有屏幕不同的 DPI?

在多显示器环境中,如何找到所有屏幕及其 DPI(可能不一样)?

我的用户通过远程桌面从家里登录,其中许多人拥有具有高 DPI 的 Surface Book,然后是具有默认 DPI (96) 的第二个屏幕。

我知道“PresentationSource.FromVisual”,但这不适用于获取所有屏幕的 DPI。

0 投票
3 回答
792 浏览

c - 如何在 C 程序中从 X11 获取更新的系统 DPI 信息?

我正在尝试创建一个 DPI 感知应用程序,该应用程序通过调整窗口大小来响应用户请求的 DPI 更改事件。

有问题的程序是用 C 语言创建的并使用 SDL2,但是为了检索系统 DPI 信息,我直接使用 xlib,因为 X11 中缺乏 SDL DPI 支持。

我找到了两种在程序启动时获取正确DPI信息的方法,都涉及从Xresource获取Xft.dpi信息:一种是使用XGetDefault(display, "Xft", "dpi"),另一种是使用XResourceManagerString, XrmGetStringDatabase和 XrmGetResource。创建程序时,它们都返回正确的 DPI 值。

问题是,如果用户在程序运行时更改系统规模,即使当我运行“xrdb -query | grep Xft.dpi”时,XGetDefault abd XrmGetResource 仍然返回旧的 DPI 值,该值确实发生了变化。

有谁知道获取更新的 Xft.dpi 值的方法?

0 投票
1 回答
597 浏览

c++ - 如何将 DPI 感知设置为 DPI_AWARENESS_CONTEXT_UNAWARE 的 CreateProcess

我有 C++ 应用程序,可以在 Windows 10 上打开其他应用程序CreateProcessA。这些应用程序可能有不同的 DPI 感知设置。

所以问题是 - 我可以创建将 DPI Awareness 设置为的流程DPI_AWARENESS_CONTEXT_UNAWARE吗?

如果不是 - 那么也许我可以DPI_AWARENESS_CONTEXT_UNAWARE为已经创建的进程设置?

UPD: 我的应用程序生成应用程序,然后更改一个位置。如果它看起来是另一台具有不同 DPI 的显示器,则会提供缩放值。

如果应用程序支持 DPI,则在移动完成后,尺寸会根据 WM_DPICHANGED 消息值更改。衍生的应用程序可能具有不同的 DPI 感知模式。所以想法是为它们设置一种模式,并以相同的逻辑控制所有它们的位置和尺寸。