Как я могу отвергнуть урегулирование ClearType, таща текст, используя Win32 API?

Я написал немного применения, которое натягивает текст в отображениях памяти и пишет им файлам. Основной код Дельфи выглядит подобным:

var
   Canvas : tCanvas;
   Text : WideString;
   TextRect : tRect;
begin
   Canvas := Bitmap.Canvas;
   Canvas.Brush.Color := clBlack;
   Canvas.Pen.Color := clBlack;
   Canvas.Font.Name := 'Courier New';
   Canvas.Font.Size := 11;
   Canvas.Font.Color := clWhite;

   TextRect := ...; //calculate text position
   DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), TextRect, DT_NOCLIP or DT_NOPREFIX or DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;

К сожалению, оттянутый текст отличается в зависимости от урегулирования ClearType компьютера, запускающего приложение. Я хотел бы иметь последовательную продукцию в своем заявлении независимо от местного урегулирования ClearType (продукция не показана, чтобы показать непосредственно так или иначе). Там некоторый выбор Win32 API состоит в том, чтобы отвергнуть местные параметры настройки ClearType?

8
nl ja de

4 ответы

Сглаживание шрифта текста убеждено шрифтом, что вы выбираете в устройство. Чтобы узнать о вариантах, предлагаемых сырым интерфейсом Win32, читайте LOGFONT документация.

В Дельфи основной API Win32 API шрифта обернут TFont класс. Собственность, которая является подходящей для этого вопроса, Качество. Значение по умолчанию fqDefault , который использует урегулирование сглаживания шрифта в масштабе всей системы. Вы хотите установить Качество к любому fqAntialiased или fqNonAntialiased .

У более старых версий Дельфи нет этой собственности. В этом случае необходимо будет звонить CreateFontIndirect , чтобы создать HFONT с необходимыми качественными параметрами настройки. Можно звонить эта функция немедленно, прежде чем вы начинаете рисовать текст:

procedure SetFontQuality(Font: TFont; Quality: Byte);
var
  LogFont: TLogFont;
begin
  if GetObject(Font.Handle, SizeOf(TLogFont), @LogFont) = 0 then
    RaiseLastOSError;
  LogFont.lfQuality := Quality;
  Font.Handle := CreateFontIndirect(LogFont);
end;

Передайте любой NONANTIALIASED_QUALITY или ANTIALIASED_QUALITY в зависимости от ваших потребностей.

12
добавлено

Сглаживание шрифта текста убеждено шрифтом, что вы выбираете в устройство. Чтобы узнать о вариантах, предлагаемых сырым интерфейсом Win32, читайте LOGFONT документация.

В Дельфи основной API Win32 API шрифта обернут TFont класс. Собственность, которая является подходящей для этого вопроса, Качество. Значение по умолчанию fqDefault , который использует урегулирование сглаживания шрифта в масштабе всей системы. Вы хотите установить Качество к любому fqAntialiased или fqNonAntialiased .

У более старых версий Дельфи нет этой собственности. В этом случае необходимо будет звонить CreateFontIndirect , чтобы создать HFONT с необходимыми качественными параметрами настройки. Можно звонить эта функция немедленно, прежде чем вы начинаете рисовать текст:

procedure SetFontQuality(Font: TFont; Quality: Byte);
var
  LogFont: TLogFont;
begin
  if GetObject(Font.Handle, SizeOf(TLogFont), @LogFont) = 0 then
    RaiseLastOSError;
  LogFont.lfQuality := Quality;
  Font.Handle := CreateFontIndirect(LogFont);
end;

Передайте любой NONANTIALIASED_QUALITY или ANTIALIASED_QUALITY в зависимости от ваших потребностей.

12
добавлено

Я полагаю, что можно создать новый логический шрифт, который не использует ClearType. Удостоверьтесь, что передали NONANTIALIASED_QUALITY флаг как fdwQuality параметр CreateFont:

Шрифт никогда не antialiased, то есть, сглаживание шрифта не сделано.

6
добавлено
Можно также использовать anti-aliased качество, которое отдает со сглаживанием в старинном стиле - т.е. без Cleartype. Это дает вам достойный качественный текст, который будет выглядеть лучше, чем текст, оттянутый без шрифта, сглаживающего безотносительно.
добавлено автор David M, источник

Я полагаю, что можно создать новый логический шрифт, который не использует ClearType. Удостоверьтесь, что передали NONANTIALIASED_QUALITY флаг как fdwQuality параметр CreateFont:

Шрифт никогда не antialiased, то есть, сглаживание шрифта не сделано.

6
добавлено
Можно также использовать anti-aliased качество, которое отдает со сглаживанием в старинном стиле - т.е. без Cleartype. Это дает вам достойный качественный текст, который будет выглядеть лучше, чем текст, оттянутый без шрифта, сглаживающего безотносительно.
добавлено автор David M, источник
Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

Delphi & Lazarus
Delphi & Lazarus
274 участник(ов)

Чат про Delphi и Lazarus