2009-05-28 55 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可以很好地工作。忙着改變我所有的字體;-)