加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中的字体平滑

发布时间:2020-12-15 10:17:35 所属栏目:大数据 来源:网络整理
导读:我在Delphi表单上需要一个大字体的标签,并注意到 其曲线仍然略有锯齿状。我比较了同样的大小 和MSWord中的字体更加流畅。研究后我找到了代码 这让我平滑我的字体,但它是凌乱的,我想知道是否 有更好的方法吗?看VCL来源,TFont似乎已经结束了 非常沮丧的NO
我在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,@LF) <> 0);
    LF.lfQuality := ANTIALIASED_QUALITY;
    Font.Handle := CreateFontIndirect(LF);
    fFontChanged := TRUE;
  end;
  inherited;
end;

end.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读