我想使用 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 像素,一切都很清晰但不正确(见图)
最佳答案
不幸的是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/