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