我在Delphi表单上需要一个大字体的标签,并注意到
其曲线仍然略有锯齿状。我比较了同样的大小
和MSWord中的字体更加流畅。研究后我找到了代码
这让我平滑我的字体,但它是凌乱的,我想知道是否
有更好的方法吗?看VCL来源,TFont似乎已经结束了
非常沮丧的NONANTIALIASED_QUALITY …
其曲线仍然略有锯齿状。我比较了同样的大小
和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。