Delphi TFontDialog - 如何缩放高 Dpi?

Jen*_*ens 7 delphi dialog highdpi

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

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

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

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

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

在此处输入图片说明

编辑 (2020-01-13):

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

无、无意识和系统意识:

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

每个监视器:

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

每个监视器 V2:

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

Uwe*_*abe 1

不幸的是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;
Run Code Online (Sandbox Code Playgroud)

请注意,对话框中指定和检索的字体大小基于系统 DPI,并且必须根据其使用的显示器 DPI 进行缩放。