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

Это означает, что переменная разыменовывается дважды. Предположим, у вас есть указатель на указатель на символ, например:

char ** variable = ...;

Если вы хотите получить доступ к значению, на которое указывает указатель, вы должны разыменовываем его дважды:

** переменная

20
задан Brian Frost 28 May 2009 в 14:51
поделиться

3 ответа

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

29
ответ дан 29 November 2019 в 23:37
поделиться

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

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

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

// lfQuality: = DEFAULT_QUALITY;

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

7
ответ дан 29 November 2019 в 23:37
поделиться

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

3
ответ дан 29 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: