Delphi中的字体平滑

Bri*_*ost 20 delphi fonts truetype 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;
Run Code Online (Sandbox Code Playgroud)

mgh*_*hie 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.
Run Code Online (Sandbox Code Playgroud)

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


tik*_*noa 7

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

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

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

// lfQuality:= DEFAULT_QUALITY;

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


小智 5

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

"简单地使用支持字体平滑的字体应该解决这个问题.德尔福使用(或至少习惯使用)MS Sans Serif作为默认值,它不支持平滑(ClearType或其他).如果你将字体设置为Tahoma(最适合XP)或Segoe UI(最适合Vista),您将根据Delphi应用程序中的系统设置自动获得字体平滑."

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