我有理由需要在Delphi表单上使用大字体的标签并注意到这一点 它的曲线仍然略带锯齿状。我将它与相同尺寸进行了比较 和MSWord中的字体更平滑。经过研究,我找到了代码 这让我平滑了我的字体,但它很乱,我想知道是否 还有更好的方法吗?看着VCL的来源,TFont似乎坚持了下来 NONANTIALIASED_QUALITY相当令人沮丧...
谢谢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;
答案 0 :(得分: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
。
答案 1 :(得分:7)
恕我直言,VCL应检查系统默认字体平滑并在运行时将其应用为默认字体。如果没有,至少它应默认为更合理的平滑。在这种情况下,人们可以争辩说,ClearType是一个更好的默认值,考虑&gt;如今,50%的显示器都是LCD(超过50%的机器运行XP或更好)。
这是一个公认的黑客攻击(正如Ken White提到的那样,如果有替代方案,这不是最好的方法),但是我需要一种方法来解决这个全局问题,包含数百种第三方组件类型的表单(使组件继承变得不切实际) )。
我更改了Graphics.pas,TFont.GetHandle中的默认字体质量,如下所示:
// lfQuality:= DEFAULT_QUALITY;
lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY,强制清除
答案 2 :(得分:5)
来自:http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html
&#34;只需使用支持字体平滑的字体就可以解决这个问题。德尔福 使用(或至少习惯使用)MS Sans Serif作为默认值,但不是 支持平滑(ClearType或其他)。如果你将字体设置为 Tahoma(最适合XP)或Segoe UI(最适合Vista),你会的 根据您的系统设置自动获取字体平滑 Delphi app。&#34;
确认,使用Delphi XE和Win7可以很好地工作。忙着改变我现在所有的字体; - )
答案 3 :(得分:3)
最简单的方法是基于TLabel创建自己的组件,例如TSmoothLabel或TAntiAliasedLabel,并将平滑代码添加到其中。然后使用您的组件而不是标准的TLabel。