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

我写了一个小应用程序,它在内存中的图像上绘制文本,并将它们写入文件。 基本的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; 

不幸的是,绘制的文本是不同的,取决于运行应用程序的计算机的ClearType设置。 我希望在应用程序中有一致的输出,而不pipe本地的ClearType设置如何(输出不会直接显示)。 是否有一些Win32 API选项来覆盖本地ClearType设置?

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

在Delphi中,底层的Win32 API字体API由TFont类包装。 与这个问题有关的财产是Quality 。 默认值是fqDefault ,它使用全系统字体平滑设置。 您希望将Quality设置为fqAntialiasedfqNonAntialiased

旧版本的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; 

根据您的需要传递NONANTIALIASED_QUALITYANTIALIASED_QUALITY

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

字体不会反锯齿,也就是说,字体平滑没有完成。