我想出了一个获取用户UI字体偏好的调用(as
反对Borland对“MS Sans Serif”的硬编码选择).
反对Borland对“MS Sans Serif”的硬编码选择).
让我们假装用户的字体偏好是:
Segoe Print,15pt
我将所有项目的字体,在所有表单中,在所有应用程序中设置为:
Segoe Print,15pt
问题是事情现在被切断了.按钮太小 – 太窄,
太短.标签中的文字被切断等.
该表单具有缩放属性,但不会因字体而异
大小.缩放后的属性按照序列化方式缩放形式
数字“0”的高度.
在帮助Borland打算让我支持的时候,我找不到任何东西
用户的Windows应用程序首选项.
如何处理用户字体首选项?
注意:由于Embargadero的新闻服务器似乎正在死亡,审查或损坏或需要登录,所以我将其从Embargadero的新闻组服务器发布.
更新1
我在谈论用户的字体偏好,而不是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: Supporting DPI and Default Font Changes
> .NET WinForms: Graphics.MeasureString returns different values than Win32 GetTextExtent
> WPF: How to layout a dialogs in XAML?
解决方法
首先,我们很清楚,Borland不再拥有德尔福. Embarcadero现在拥有德尔福,现在我们处于安全可靠的手中.
好的,就你的问题
诀窍是将TForm.AutoScroll设置为False并确保您的开发机器设置为小字体.离开TForm.Scaled单独(默认值为True).
这就是我们在内部这样做,IDE处理一切都很好.