Сглаживание шрифтов в 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;
Ответы
Ответ 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.