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

У меня была причина, чтобы мне понадобилась метка с крупным шрифтом на форме 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 ответа

Решение

Вы можете обмануть 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 будет создан.

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

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

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

// lfQuality: = DEFAULT_QUALITY;

Качество: = 5; // (HACK) CLEARTYPE_QUALITY, принудительно устанавливает тип

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

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

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

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

Другие вопросы по тегам