代码之家  ›  专栏  ›  技术社区  ›  Brian Frost

Delphi中的字体平滑

  •  20
  • Brian Frost  · 技术社区  · 15 年前

    我有理由在Delphi窗体上需要一个大字体的标签,并注意到 它的曲线仍然有点参差不齐。我把这个和同样大小的比较 和MSWord中更平滑的字体。经过研究,我找到了代码 这让我可以流畅地使用字体,但很混乱,我想知道 有更好的方法吗?从VCL来源来看,tfont似乎 不重要的质量,这是相当令人沮丧的…

    谢谢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 回复  |  直到 13 年前
        1
  •  29
  •   mghie    15 年前

    您可以欺骗VCL创建自己的类,该类继承自 TLabel . 这是概念验证代码,用Delphi4测试,应该可以开始使用。

    为自己创建一个新单位 标签 班级:

    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 将被创建。

        2
  •  7
  •   tikinoa    15 年前

    imho,VCL应该检查系统默认字体平滑,并在运行时将其作为默认字体应用。如果不是,至少应该默认为更合理的平滑。在这种情况下,有人可能会认为ClearType是一个更好的默认值,因为目前50%的显示器是LCD(并且超过50%的机器运行XP或更好)。

    这是一个公认的黑客(正如Ken White所提到的,如果有其他选择的话,这不是最好的方法),但是我需要一种全局性的方法来修复包含数百个第三方组件类型的表单(使得组件继承不切实际)。

    我在graphics.pas、tfont.gethandle中更改了默认字体质量,如下所示:

    //lfquality:=默认质量;

    L质量:=5;。// (黑客) ClearType质量,强制ClearType

        3
  •  5
  •   Maya    13 年前

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

    “只要使用支持字体平滑的字体就可以解决这个问题。德尔菲 使用(或至少使用)ms sans-serif作为默认值,而不是 支持平滑(ClearType或其他)。如果将字体设置为 Tahoma(最适合XP)或Segoe UI(最适合Vista),您将 根据您的 Delphi应用程序。

    确认,它使用DelphiXE和Win7很好地工作。正在忙于更改我的所有字体;-)

        4
  •  3
  •   Ken White    15 年前

    最简单的方法是基于tlabel创建自己的组件,例如tsmoothLabel或tantialiasedLabel,并向其中添加平滑代码。然后使用组件而不是标准的tlabel。

    推荐文章