我已经编写了一个小应用程序,可以在内存中的图像上绘制文本并将其写入文件。基本的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设置,绘制的文本是不同的。我希望在我的应用程序中有一个一致的输出,而不考虑本地的cleartype设置(输出不会直接显示到屏幕上)。是否有一些win32 api选项来覆盖本地cleartype设置?

最佳答案

文本的字体平滑由您在设备中选择的字体决定。要了解原始win32接口提供的选项,请阅读LOGFONT文档。
在delphi中,底层win32 api字体api由TFont类包装。与此问题相关的属性是Quality。默认值为fqDefault,使用系统范围的字体平滑设置。您想将Quality设置为fqAntialiasedfqNonAntialiased
旧版本的Delphi没有此属性。在这种情况下,您需要调用CreateFontIndirect来创建具有所需质量设置的HFONT。您可以在开始绘制文本之前立即调用this function

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

07-24 09:46
查看更多