使用Win32 API绘制文本时如何覆盖ClearType设置?

ble*_*tin 8 windows delphi winapi delphi-2006

我写了一个小应用程序,它在内存中的图像上绘制文本并将它们写入文件.基本的Delphi代码看起来类似于:

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;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,绘制的文本因运行应用程序的计算机的ClearType设置而异.我希望在我的应用程序中有一个一致的输出,无论本地ClearType设置如何(输出都不会直接显示到屏幕上).是否有一些Win32 API选项来覆盖本地ClearType设置?

Dav*_*nan 12

文本的字体平滑由您在设备中选择的字体决定.要了解原始Win32接口提供的选项,请阅读LOGFONT文档.

在Delphi中,底层的Win32 API字体API由TFont类包装.与此问题相关的属性是Quality.默认值是fqDefault使用系统范围的字体平滑设置.您想要设置QualityfqAntialiasedfqNonAntialiased.

较旧版本的Delphi没有此属性.在这种情况下,您需要调用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;
Run Code Online (Sandbox Code Playgroud)

通过NONANTIALIASED_QUALITYANTIALIASED_QUALITY根据您的需要.


And*_*and 6

我相信你可以创建一个不使用任何ClearType的新逻辑字体.确保将NONANTIALIASED_QUALITY标志作为fdwQuality参数传递CreateFont:

字体永远不会被抗锯齿,也就是说,字体平滑没有完成.

  • 您还可以使用消除锯齿的质量,它使用旧式抗锯齿渲染 - 即没有Cleartype.这样可以为您提供质量上乘的文本,这些文本看起来比没有任何字体平滑的文本更好. (4认同)