我想到了一个调用方法,可以获取用户界面字体偏好(与Borland硬编码的选择“MS Sans Serif”不同)。
假设用户的字体偏好是:
问题在于现在的东西被截断了。按钮太小 - 太窄、太短。标签中的文本被剪切等。
这个表单有一个"Scaled"属性,但它不会随着字体大小的改变而改变。当数字"0"的高度改变时,该属性会根据序列化后的表单进行缩放。
我找不到任何有关Borland如何支持用户Windows应用程序首选项的帮助信息。
我该如何处理用户字体首选项?
注意:我从Embargadero的新闻组服务器转帖过来,因为Embargadero的新闻服务器似乎正在死亡、审查、损坏或要求登录。
更新1:
我谈论的是用户的字体首选项,而不是DPI设置。例如:想象一下以下的语言中立伪代码:
假设用户的字体偏好是:
Segoe Print, 15pt
我将所有应用程序中所有表单上的所有项目的字体设置为:
Segoe Print, 15pt
问题在于现在的东西被截断了。按钮太小 - 太窄、太短。标签中的文本被剪切等。
这个表单有一个"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;