2009-05-28 170 views
19

我有理由需要一个德尔福的形式与大字体的标签,并注意到 其曲线仍然有点锯齿状。我比较了这与相同的尺寸 和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; 
+3

所以这个代码的工作(你只是想清理它并找到一些简单的方法),还是不够流畅或不工作? – schnaader 2009-05-28 14:58:24

+0

你认为这段代码的哪一部分是凌乱的? – 2009-05-28 21:52:57

+0

当VCL已经完成这件事时,我必须在每个标签上戳出每一个字体,这似乎很浪费。我寻找我可以重写或继承的东西,但没有运气。我想这是实现我想要的唯一途径。 Bri – 2009-08-11 15:25:46

回答

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

3

最简单的方法是基于的TLabel,如TSmoothLabel或TAntiAliasedLabel来创建自己的组件,并添加你的平滑代码。然后你使用你的组件代替标准TLabel。

7

恕我直言,VCL应该检查系统默认字体平滑,并在运行时将其作为默认应用。如果没有,至少它应该默认更合理的平滑。在这种情况下,人们可能会认为ClearType是一种更好的默认设置,因为考虑到现在50%以上的显示器都是LCD(并且大于50%的机器运行XP或更好)。

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

我改变默认字体质量Graphics.pas,TFont.GetHandle如下:

// lfQuality:= DEFAULT_QUALITY;

lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY,力的ClearType

5

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

“简单地使用支持字体平滑的字体应该解决这个问题的Delphi 使用(或至少用于使用)MS无如果您将字体设置为 Tahoma(最适用于XP)或Segoe UI(最适用于Vista),您将根据系统设置自动获取字体平滑(默认为 )。你的 德尔福应用程序“。

确认,使用Delphi XE和Win7可以很好地工作。忙着改变我所有的字体;-)