我想出了获得用户UI字体偏好的调用(而不是Borland的硬编码选择"MS Sans Serif").
让我们假装用户的字体偏好是:
Segoe Print, 15pt
我将所有表单中所有项目的字体设置为:
Segoe Print, 15pt
问题是事情现在被切断了.按钮太小 - 太窄,太短.标签中的文字被切断等.
表单具有Scaled属性,但不会因字体大小而改变.缩放属性在基于数字"0"的高度序列化时缩放形式.
我找不到Borland打算如何支持用户的Windows应用程序首选项的帮助.
如何处理用户字体首选项?
注意:我从Embargadero的新闻组服务器上发布了这个,因为Embargadero的新闻服务器似乎正在死亡,或审查,破坏或需要登录.
我在谈论用户的字体偏好,而不是DPI设置.即:想象下面的语言中立伪代码:
procedure TForm1.FormCreate(Sender: TObject); var FontFace: string; FontHeight: Integer; begin GetUserFontPreference(out FontFace, out FontHeight); Self.Font.Name := FontFace; Self.Font.Height := FontHeight; end;
注意:这不是我的实际代码(毕竟它是语言中立的伪代码).但另外,您需要递归地遍历表单上的每个控件,在需要更改时更改字体.如果字体应用的样式与其父样式不同(例如粗体),并且不再从其父级继承,则需要手动设置.
根据lkessler的请求,这是从Windows检索用户的UI字体首选项的代码:
procedure GetUserFontPreference(out FaceName: string; out PixelHeight: Integer); var lf: LOGFONT; begin ZeroMemory(@lf, SizeOf(lf)); //Yes IconTitleFont (not SPI_GETNONCLIENTMETRICS MessageFont) if SystemParametersInfo(SPI_GETICONTITLELOGFONT, SizeOf(lf), @lf, 0) then begin FaceName := PChar(Addr(lf.lfFaceName[0])); PixelHeight := lf.lfHeight; end else begin { If we can't get it, then assume the same non-user preferences that everyone else does. } FaceName := 'MS Shell Dlg 2'; PixelHeight := 8; end; end;
.NET 2.0 WinForm:支持DPI和默认字体更改
.NET WinForms:Graphics.MeasureString返回的值不同于Win32 GetTextExtent
WPF:如何在XAML中布局对话框?
Nick Hodges.. 9
首先,我们很清楚,Borland不再拥有Delphi了.Embarcadero现在拥有德尔福,现在我们安全,安全.
好的,关于你的问题.
诀窍是将TForm.AutoScroll设置为False并确保您的开发机器设置为小字体.单独保留TForm.Scaled(默认值为True).
这就是我们在这里内部做的事情,IDE处理的一切都很好.
首先,我们很清楚,Borland不再拥有Delphi了.Embarcadero现在拥有德尔福,现在我们安全,安全.
好的,关于你的问题.
诀窍是将TForm.AutoScroll设置为False并确保您的开发机器设置为小字体.单独保留TForm.Scaled(默认值为True).
这就是我们在这里内部做的事情,IDE处理的一切都很好.