我写了一个小应用程序,它在内存中的图像上绘制文本,并将它们写入文件。 基本的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
设置为fqAntialiased
或fqNonAntialiased
。
旧版本的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_QUALITY
或ANTIALIASED_QUALITY
。
我相信你可以创建一个不使用任何ClearType的新的逻辑字体。 确保传递NONANTIALIASED_QUALITY
标志作为CreateFont
的fdwQuality
参数:
字体不会反锯齿,也就是说,字体平滑没有完成。