Сглаживание шрифтов в Delphi - PullRequest
20 голосов
/ 28 мая 2009

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

29 голосов
/ 28 мая 2009

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

7 голосов
/ 29 мая 2009

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

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

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

// lfQuality: = DEFAULT_QUALITY;

lfQuality: = 5; // (HACK) CLEARTYPE_QUALITY, форсированный тип

5 голосов
/ 21 октября 2011

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

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

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

3 голосов
/ 28 мая 2009

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

...