Подтвердить что ты не робот

Сглаживание шрифтов в Delphi

У меня возникла необходимость в ярлыке с большим шрифтом в форме Delphi и заметила, что его кривые все еще слегка зазубрены. Я сравнил это с тем же размером и шрифт в MSWord, который был намного более плавным. После исследования я нашел код что позволило мне сгладить мои шрифты, но это беспорядочно, и мне было интересно, если был лучший способ? Глядя в источник VCL, TFont, похоже, NONANTIALIASED_QUALITY, который довольно расстраивает...

Спасибо Bri

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;
4b9b3361

Ответ 1

Вы можете обмануть 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 unit после StdCtrls. Это приводит к созданию собственного класса AntiAliasedLabel.TLabel, где обычно создается StdCtrls.TLabel.

Ответ 2

IMHO, VCL должен проверять сглаживание шрифта System default и применять его как значение по умолчанию во время выполнения. Если нет, по крайней мере, он должен по умолчанию использовать более разумное сглаживание. В этом случае можно утверждать, что ClearType будет лучшим дефолтом, учитывая, что > 50% мониторов в эти дни являются ЖК-дисплеем (и более 50% компьютеров работают с XP или выше).

Это признанный взлом (и, как говорит Кэн Уайт, а не лучший подход, если есть альтернативы), но мне нужен был способ исправить это глобально для форм, содержащих буквально сотни сторонних типов компонентов (делая наследование компонентов нереалистичным).

Я изменил качество шрифта по умолчанию в Graphics.pas, TFont.GetHandle следующим образом:

//lfQuality: = DEFAULT_QUALITY;

lfКачество: = 5;// (HACK) CLEARTYPE_QUALITY, заставляет cleartype

Ответ 3

От: http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

", просто используя шрифт, который поддерживает сглаживание шрифтов, должен это исправить. Delphi использует (или по крайней мере используется для использования) MS Sans Serif по умолчанию, что не сглаживание поддержки (ClearType или иначе). если вы установили шрифт Tahoma (лучше всего подходит для XP) или Segoe UI (лучше всего для Vista), вы будете автоматически получать сглаживание шрифтов в соответствии с системными настройками в вашем Delphi ".

Подтвержденный, он прекрасно работает с Delphi XE и Win7. Занято сменой всех моих шрифтов прямо сейчас; -)

Ответ 4

Самый простой способ - создать свой собственный компонент на основе TLabel, например TSmoothLabel или TAntiAliasedLabel, и добавить к нему свой сглаживающий код. Затем вы используете свой компонент вместо стандартного TLabel.