Delphi中的字体平滑

时间:2009-05-28 14:51:16

标签: delphi fonts true-type-fonts smoothing

我有理由需要在Delphi表单上使用大字体的标签并注意到这一点 它的曲线仍然略带锯齿状。我将它与相同尺寸进行了比较 和MSWord中的字体更平滑。经过研究,我找到了代码 这让我平滑了我的字体,但它很乱,我想知道是否 还有更好的方法吗?看着VCL的来源,TFont似乎坚持了下来 NONANTIALIASED_QUALITY相当令人沮丧...

谢谢Bri

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;

4 个答案:

答案 0 :(得分:29)

您可以欺骗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.

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

答案 1 :(得分:7)

恕我直言,VCL应检查系统默认字体平滑并在运行时将其应用为默认字体。如果没有,至少它应默认为更合理的平滑。在这种情况下,人们可以争辩说,ClearType是一个更好的默认值,考虑&gt;如今,50%的显示器都是LCD(超过50%的机器运行XP或更好)。

这是一个公认的黑客攻击(正如Ken White提到的那样,如果有替代方案,这不是最好的方法),但是我需要一种方法来解决这个全局问题,包含数百种第三方组件类型的表单(使组件继承变得不切实际) )。

我更改了Graphics.pas,TFont.GetHandle中的默认字体质量,如下所示:

// lfQuality:= DEFAULT_QUALITY;

lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY,强制清除

答案 2 :(得分:5)

来自:http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

&#34;只需使用支持字体平滑的字体就可以解决这个问题。德尔福 使用(或至少习惯使用)MS Sans Serif作为默认值,但不是 支持平滑(ClearType或其他)。如果你将字体设置为 Tahoma(最适合XP)或Segoe UI(最适合Vista),你会的 根据您的系统设置自动获取字体平滑 Delphi app。&#34;

确认,使用Delphi XE和Win7可以很好地工作。忙着改变我现在所有的字体; - )

答案 3 :(得分:3)

最简单的方法是基于TLabel创建自己的组件,例如TSmoothLabel或TAntiAliasedLabel,并将平滑代码添加到其中。然后使用您的组件而不是标准的TLabel。