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 像素,一切都很清晰但不正确(见图)
不幸的是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 进行缩放。