我有理由需要在 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, SizeOf(TLogFont), @LF) <> 0);
LF.lfQuality := ANTIALIASED_QUALITY;
Font.Handle := CreateFontIndirect(LF);
fFontChanged := TRUE;
end;
inherited;
end;
end.
现在修改包含标签的表单单元,在StdCtrls
之后添加AntiAliasedLabel
单元。这会导致在通常创建 StdCtrls.TLabel
的位置创建您自己的类 AntiAliasedLabel.TLabel
。
关于delphi - Delphi 中的字体平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921249/