20

Delphiフォームに大きなフォントのラベルが必要になったのですが、その曲線がまだわずかにギザギザになっていることに気付きました。私はこれを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;
4

4 に答える 4

29

VCLをだまして、から継承する独自のクラスを作成することができますTLabelこれは概念実証コードであり、Delphi4でテストされています。

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にユニットを追加します。これにより、通常作成される場所に独自のクラスが作成されます。 StdCtrlsAntiAliasedLabel.TLabelStdCtrls.TLabel

于 2009-05-28T16:17:16.993 に答える
7

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

これは認められたハックです(そしてKen Whiteが言及しているように、代替手段がある場合は最善のアプローチではありません)が、文字通り何百ものサードパーティコンポーネントタイプを含むフォームに対してこれをグローバルに修正する方法が必要でした(コンポーネントの継承を非現実的にします)。

Graphics.pas、TFont.GetHandleのデフォルトのフォント品質を次のように変更しました。

// lfQuality:= DEFAULT_QUALITY;

lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY、cleartypeを強制します

于 2009-05-28T21:35:53.933 に答える
5

差出人:http ://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

「フォントスムージングをサポートするフォントを使用するだけで、これを修正できます。Delphiは、デフォルトでMS Sans Serifを使用します。これは、スムージング(ClearTypeなど)をサポートしません。フォントをTahomaに設定した場合( XP)またはSegoe UI(Vistaに最適)の場合、Delphiアプリのシステム設定に従ってフォントスムージングが自動的に行われます。」

確認済みですが、DelphiXEとWin7を使用して美しく動作します。今、すべてのフォントを変更するのに忙しい;-)

于 2011-10-21T11:57:29.383 に答える
3

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

于 2009-05-28T15:04:32.990 に答える