2009-05-28 5 views
19

デルファイフォームで大きなフォントのラベルが必要になり、そのカーブがまだ若干ギザギザになっていたことに気付いたのですが、 です。私はこれを同じサイズの と比較し、MSWordのフォントははるかに滑らかでした。研究の後、コード が見つかりました。私のフォントを滑らかにすることができましたが、それは面倒です。 良い方法があるかどうか疑問に思っていましたか? VCLソースで見ると、のTFontはかなりイライラさせられる NONANTIALIASED_QUALITYに固執ようだ...Delphiのフォントスムージング

おかげブリ

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

+0

このコードのどの部分を乱雑に思っていますか? –

+0

VCLがすでにこれを行ったときに、すべてのラベルのすべてのフォントをポックしなければならないのは無駄です。私は何かを見直したり、サブクラス化することができますが運がありません。私はこれが欲しいものを達成する唯一の方法だと思います。 Bri –

答えて

29

TLabelを継承する独自のクラスを作成するようにVCLをトリックすることができます。 これはデルファイ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. 

は今StdCtrlsAntiAliasedLabelユニットを追加し、ラベルを含むフォームのユニットを変更します。これにより、通常StdCtrls.TLabelが作成されるところに、独自のクラスAntiAliasedLabel.TLabelが作成されます。

+0

+1非常に興味深い解決策! – jpfollenius

+4

+1うわー - そういうトリックで逃げることはできないと思いました。私の目を開いてくれてありがとう! – robsoft

+0

非常に、非常に、非常に、非常に、非常に、非常に、非常に.... NICE!この簡単なトリックをありがとう。 – Codebeat

3

最も簡単な方法は、このようなTSmoothLabelやTAntiAliasedLabelとして、TLabelをもとに、独自のコンポーネントを作成することです、スムージングコードを追加します。次に、標準TLabelの代わりにコンポーネントを使用します。

+0

真ですが、TLabelクラスを指定する既存のDFMをロードしていますので、TLAbelを再登録する方法があれば、あなたの提案がうまくいく可能性があります。 Bri –

+1

方法はありますが、実行時に独自のメソッドでTLabel.NewInstance VMTエントリを置き換える必要があります。 JCL(JEDIコードライブラリ)にはこれを行うための関数があります。 –

+3

@Brian:新しいクラスを使用するために(IDEの外から)DFMとPASファイルを修正するだけの理由はありますか?代わりに、それらをサポートするDelphiのバージョンを使用している場合は、TLabelのクラスヘルパーを使用できます。 (将来のデルファイを指定してください)それ以外の方法がある場合はクラスヘルパールートを推奨しませんが、スコープ内にあるTLabelに影響するためです。 –

7

IMHOの場合、VCLはシステムのデフォルトのフォントスムージングをチェックし、実行時にデフォルトとして適用する必要があります。そうでなければ、少なくともより合理的なスムージングにデフォルトする必要があります。この場合、ClearTypeがより良いデフォルトになると主張することができます。これは最近、LCDの50%以上がLCDであることを考慮しています(そして、マシンの50%以上がXP以上を実行しています)。

これは認知されたハックです(ケン・ホワイトが言及しているように、代替案がある場合は最良の方法ではありません)。しかし、文字通り何百もの第三者コンポーネントタイプを含むフォームに対してこれを修正する方法が必要でした非現実的)。

次のように私はGraphics.pas、TFont.GetHandleにデフォルトフォントの品質を変更:

// lfQuality:= DEFAULT_QUALITY。

lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY、強制的にClearTypeの

5

から:http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

「単にフォントスムージングをサポートするフォントを使用すると、この問題を解決する必要がありますデルファイ 用途(または少なくとも使用するために使用される)MSなき。あなたが Tahoma(XP用に最適)またはSegoe UI(Vista用に最適)にフォントを設定した場合、 は自動的にフォントのスムージングを次のように設定します。あなたの Delphiアプリ "

デルファイXEとWin7を使って美しく動作します。現在、私のフォントをすべて変更しています;-)

関連する問題