20

我有理由在 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;
4

4 回答 4

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

于 2009-05-28T16:17:16.993 回答
7

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

这是一个公认的 hack(正如 Ken White 所提到的,如果有替代方案,这不是最好的方法),但我需要一种方法来全局修复这个包含数百个第 3 方组件类型的表单(使组件继承不切实际)。

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

// lfQuality := DEFAULT_QUALITY;

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

于 2009-05-28T21:35:53.933 回答
5

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

“只需使用支持字体平滑的字体即可解决此问题。Delphi 使用(或至少曾经使用)MS Sans Serif 作为默认值,它不支持平滑(ClearType 或其他)。如果您将字体设置为 Tahoma(最适合XP)或 Segoe UI(最适合 Vista),您将根据 Delphi 应用程序中的系统设置自动获得字体平滑。”

经证实,它使用 Delphi XE 和 Win7 运行良好。现在正忙于更改我所有的字体;-)

于 2011-10-21T11:57:29.383 回答
3

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

于 2009-05-28T15:04:32.990 回答