delphi - Delphi 中的字体平滑

标签 delphi fonts truetype smoothing

我有理由需要在 Delphi 表单上使用大字体的标签,并注意到 它的曲线仍然略有锯齿状。我把它与相同尺寸的进行了比较 MSWord 中的字体更加流畅。经过研究我发现了代码 这让我可以平滑我的字体,但它很困惑,我想知道是否 还有更好的办法吗?查看 VCL 源代码,TFont 似乎致力于 NONANTIALIASED_QUALITY 这相当令人沮丧......

谢谢布里

procedure TForm1.SetFontSmoothing(AFont: TFont);
var
  tagLOGFONT: TLogFont;
begin
  GetObject(
    AFont.Handle,
    SizeOf(TLogFont),
    @tagLOGFONT);
  tagLOGFONT.lfQuality  := ANTIALIASED_QUALITY;
  AFont.Handle := CreateFontIndirect(tagLOGFONT);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I : integer;
begin
  For I :=0 to ComponentCount-1 do
    If Components[I] is TLabel then
      SetFontSmoothing( TLabel( Components[I] ).Font );
end;

最佳答案

您可以欺骗 VCL 创建您自己的继承自 TLabel 的类。 这是概念验证代码,使用 Delphi 4 进行了测试,应该可以帮助您入门。

为您自己的 TLabel 类创建一个新单元:

unit AntiAliasedLabel;

interface

uses
  Windows, Messages, SysUtils, Controls, StdCtrls, Graphics;

type
  TLabel = class(StdCtrls.TLabel)
  private
    fFontChanged: boolean;
  public
    procedure Paint; override;
  end;

implementation

procedure TLabel.Paint;
var
  LF: TLogFont;
begin
  if not fFontChanged then begin
    Win32Check(GetObject(Font.Handle, SizeOf(TLogFont), @LF) <> 0);
    LF.lfQuality := ANTIALIASED_QUALITY;
    Font.Handle := CreateFontIndirect(LF);
    fFontChanged := TRUE;
  end;
  inherited;
end;

end.

现在修改包含标签的表单单元,在StdCtrls之后添加AntiAliasedLabel单元。这会导致在通常创建 StdCtrls.TLabel 的位置创建您自己的类 AntiAliasedLabel.TLabel

关于delphi - Delphi 中的字体平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921249/

相关文章:

html - Safari 渲染谷歌字体海量

android - 自制图标字体在移动浏览器上呈现带有图标字形的字符

delphi - 如何摆脱被 `continue` 混淆的编译器警告?

delphi - 添加新项目类型后出现 "Invalid image size"错误如何恢复对象存储库?

delphi - 构建配置采用的是哪个版本的 Delphi?

java - Ubuntu 命令未找到 fc-list jasper 报告 net.sf.jasperreports.engine.util.JRFontNotFoundException

java - 将.ttf文件添加到java项目中

sql-server - 如何在Delphi中使用多线程设计请求处理?

vb.net - 字体安装了吗?功能

iphone - 我们如何在 iOS 应用程序中使用自定义字体?