我提出了获取用户 UI 字体偏好的调用(与 Borland 的硬编码选择“MS Sans Serif”相对)。
假设用户的字体偏好是:
Segoe Print, 15pt
我将所有应用程序中所有表单上所有项目的字体设置为:
Segoe Print, 15pt
问题是现在事情被切断了。按钮太小 - 太窄,太短。标签中的文本被切断等。
该表单具有它的 Scaled 属性,但这不会根据字体大小而改变。scaled 属性在序列化时根据数字“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;