微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi:处理用户的字体偏好

我想出了一个获取用户UI字体偏好的调用(as
反对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处理一切都很好.

原文地址:https://www.jb51.cc/delphi/101434.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐