Сглаживание шрифтов в 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;
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
будет создан.
IMHO, VCL должен проверять сглаживание шрифта по умолчанию и применять его как значение по умолчанию во время выполнения. Если нет, по крайней мере, он должен по умолчанию использовать более разумное сглаживание. В этом случае можно утверждать, что ClearType будет лучшим по умолчанию, учитывая, что > 50% мониторов в наши дни являются ЖК-дисплеями (и более 50% компьютеров работают под управлением XP или лучше).
это признанный Хак (и, как упоминает Кен Уайт, не лучший подход, если есть альтернативы), но мне нужен был способ исправить это глобально для форм, содержащих буквально сотни сторонних типов компонентов (что делает наследование компонентов нереалистичным).
Я изменил качество шрифта по умолчанию в графике.pas, TFont.GetHandle следующим образом:
/ / lfQuality: = DEFAULT_QUALITY;
lfQuality := 5; // (HACK) CLEARTYPE_QUALITY, силы cleartype
From:http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html
"просто, используя шрифт, который поддерживает сглаживание шрифтов, следует исправить. Дельфи использует (или, по крайней мере, используется для использования) MS без засечек по умолчанию, что не поддержка сглаживания (ClearType или иначе). если установить шрифт Тахома (лучший для XP) или Segoe UI (лучший для Vista), вы будете автоматически получить сглаживание шрифтов в соответствии с настройками системы в вашем Дельфи приложение."
подтверждено, он прекрасно работает с использованием Delphi XE и Win7. Занят изменением всех моих шрифтов прямо сейчас ; -)
самый простой способ-создать свой собственный компонент на основе TLabel, например TSmoothLabel или TAntiAliasedLabel, и добавить в него код сглаживания. Затем вы используете свой компонент вместо стандартного TLabel.