2009-05-28 22 views
19

Delphi formunda büyük bir yazı tipine sahip bir etikete ihtiyacım vardı ve eğrilerinin hala biraz pürüzlü olduğunu fark ettim. Ben bu aynı boyutta ve MSWord yazı tipi ile daha pürüzsüz oldu. Araştırmadan sonra yazı tipimi düzeltmeme izin veren kod 'u buldum ama dağınık ve 'un daha iyi bir yolu olup olmadığını merak ediyordum? VCL kaynağında baktığımızda, TFont oldukça sinir bozucu NONANTIALIASED_QUALITY ...Delphi'de font düzgünleştirme

Teşekkür Bri kolay yolu böyle TSmoothLabel veya TAntiAliasedLabel olarak TLabel dayalı kendi bileşeni oluşturmaktır

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

Bu kod da çalışıyor (ve sadece temizlemek ve kolay bir yol bulmak istersiniz) ya da hala yeterince pürüzsüz veya çalışmıyor mu? – schnaader

+0

Bu kodun hangi kısmını dağınık olarak değerlendiriyorsunuz? –

+0

VCL zaten bunu yaptığında, her etiket üzerindeki her yazı tipini çakıştırmam gerekmesi israf gibi görünüyor. Üstesinden gelebileceğim bir şey aradım ya da alt sınıftan başka şansım yok. Sanırım istediğimi gerçekleştirmenin tek yolu bu. Bri –

cevap

29

VCL'yi TLabel'dan devralan kendi sınıfınızı oluşturmaya kandırabilirsiniz. Bu, çalışmaya başlamanız gereken Delphi 4 ile test edilmiş konsept kanıtıdır.

Kendi TLabel sınıf için yeni bir birim oluşturun:

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. 

Şimdi StdCtrls sonra AntiAliasedLabel birimi ekleyerek etiket içeren formu birimini değiştirmek. Bu, normalde StdCtrls.TLabel'un oluşturulacağı, kendi sınıfınızda AntiAliasedLabel.TLabel sınıfının oluşturulmasına neden olur.

+0

+1 çok ilginç bir çözüm! – jpfollenius

+4

+1 Woah - Bunun gibi hilelerle kaçabileceğin hakkında hiçbir fikrim yoktu. Gözlerimi açtığın için teşekkürler! – robsoft

+0

Çok, çok, çok, çok, çok, çok .... GÜZEL! Bu kolay numara için teşekkür ederim. – Codebeat

3

vakfetmiş görünüyor ve bunun için düzeltme kodunuzu ekleyin. Sonra, standart TLabel yerine, bileşeninizi kullanırsınız.

+0

Doğru, ancak TLabel sınıfını belirten mevcut bir DFM yüklüyorum, bu yüzden TLAbel'i yeniden kaydettirmenin bir yolu varsa öneriniz işe yarayabilir. Bri –

+1

Bir yolu var, ancak TLabel.NewInstance VMT girdisini çalışma zamanında kendi yöntemiyle değiştirmeyi gerektirir. JCL (JEDI Kod Kitaplığı) bunu yapmak için işlevlere sahiptir. –

+3

@Brian: Yeni sınıfınızı kullanmak için neden DFM ve PAS dosyalarını (IDE'nin dışından) düzeltemiyorsunuz? Alternatif: Eğer onları destekleyen bir Delphi sürümü kullanıyorsanız, TLabel için bir sınıf yardımcısı kullanabilirsiniz. (Gelecekte hangi Delphi'yi belirtin.) Başka bir yol varsa, sınıf yardımcı yolunu önermiyorum, çünkü bu, kapsamındaki herhangi bir TLabel'i etkileyecektir. –

7

IMHO, VCL, Sistem varsayılan yazı tipi yumuşatmayı kontrol etmeli ve bunu çalışma zamanında varsayılan olarak uygulamalıdır. Değilse, en azından daha makul bir yumuşatma için varsayılan olmalıdır. Bu durumda, ClearType'ın daha iyi bir varsayılan olacağını söyleyebiliriz, bu günlerde monitörlerin% 50'si LCD'dir (ve makinelerin% 50'sinden fazlası XP veya daha iyi çalışır).

Bu kabul edilen bir korsanlıktır (ve Ken White'ın söylediği gibi, alternatifler varsa en iyi yaklaşım değildir), ama yüzlerce üçüncü taraf bileşen türlerini içeren formlar için küresel olarak bunu düzeltmenin bir yoluna ihtiyacım vardı (bileşen kalıtımını yapma gerçekçi).

// lfQuality:

Ben TFont.GetHandle aşağıdaki gibi Graphics.pas içinde varsayılan Yazı Kalite değişti = DEFAULT_QUALITY;

lfQuality: = 5; // (HACK) CLEARTYPE_QUALITY, kuvvetler cleartype

5

Gönderen:. http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

"basitçe Bunu düzeltmek gerekir Delphi kullanır yazı tipi düzeltmeyi destekleyen bir yazı tipi kullanılarak (veya en azından kullanmak için kullanılır), MS Sans Varsayılan olarak, desteğini (ClearType veya başka bir şekilde) desteklemez. Yazı tipinizi Tahoma (XP için en iyisi) veya Segoe UI (Vista için en iyisi) olarak ayarlarsanız, otomatik olarak sistem ayarlarına göre yazı tipi yumuşatması yaparsınız. senin Delphi uygulaması. "

Onaylandı, Delphi XE ve Win7 kullanılarak güzel bir şekilde çalışıyor.Şu anda tüm yazı tiplerini değiştirerek meşgul ;-)