Delphi TFontDialog - 如何缩放高 Dpi?

标签 delphi dialog highdpi

我想使用 TFontDialog在高 dpi 显示器上使用 Delphi 10.3.3。

但不幸的是,Delphi 并没有真正扩展内容。
(检查示例(Beispiel)的位置!)

我有 2 个显示器。主要有 96ppi,另一个 144ppi。
我的应用程序正在第二个上运行。

你是如何在你的应用程序中解决这样的问题的?
有没有办法解决这个问题,还是我必须希望 Delphi 10.4 能解决这个问题?

使用 200% 或更高时,您将无法再读取字体大小。

enter image description here

编辑 (2020-01-13):

一切都取决于 Delphi 的 DPI 感知集:

无、无意识和系统意识:

FontDialog 的大小为 648x518 像素,一切都很好,但很模糊

每个监视器:

FontDialog 的大小为 433x346 像素且太小 (100%)

每个监视器 V2:

FontDialog 的大小为 648x528 像素,一切都很清晰但不正确(见图)

最佳答案

不幸的是TFontDialog ,或者准确地说是基础ChooseFont来自 Windows,(尚)不支持每个 Monitor V2 DPI 感知。作为一种解决方法,您可以在显示对话框时暂时切换到系统感知,然后再切换回来。
为了实现这一点,我建议使用一个覆盖 TFontDialog 的内插器类。 :

type
  TFontDialog = class(Vcl.Dialogs.TFontDialog)
  protected
    function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; override;
  end;

function TFontDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
var
  previousDpiContext: DPI_AWARENESS_CONTEXT;
begin
  previousDpiContext := SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);
  try
    Result := inherited TaskModalDialog(DialogFunc, DialogData);
  finally
    SetThreadDpiAwarenessContext(previousDpiContext);
  end;
end;
请注意,提供给对话框和从对话框中检索的字体大小基于系统 DPI,并且必须从/到它所使用的监视器 DPI 进行缩放。

关于Delphi TFontDialog - 如何缩放高 Dpi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59679860/

相关文章:

regex - System.RegularExpressions.TRegEx 是线程安全的吗?

python - 在 glade 中使用文件选择器对话框

c++ - 使用 ATL 调用 Dialog.DoModal 在 Windows CE 6.0 上不起作用

qt - 带有 SVG 的 QIcon 显示为黑色

multithreading - 处理传递给 TThread.Queue 的匿名过程中的局部变量

forms - 如何在启动时隐藏 Delphi XE Forms 应用程序的主窗体?

html - 如何显示类似于来自 span 元素的对话框消息的弹出窗口

c++ - 如何着手开发新的 Qt 5.7+ High-DPI Per Monitor DPI Aware 应用程序?

R/RStudio : graph scaling issues & fuzziness on high dpi screens

delphi - 如何为 `TListView` 中的每个现有项目添加其他数据?