【问题标题】:How can I override ClearType setting when drawing text using the Win32 API?使用 Win32 API 绘制文本时如何覆盖 ClearType 设置?
【发布时间】:2013-02-25 15:49:43
【问题描述】:

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

【问题讨论】:

    标签: windows delphi winapi delphi-2006


    【解决方案1】:

    文本的字体平滑由您在设备中选择的字体决定。要了解原始 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

    【讨论】:

      【解决方案2】:

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

      字体从不抗锯齿,即不进行字体平滑处理。

      【讨论】:

      • 您还可以使用抗锯齿质量,它使用旧式抗锯齿渲染 - 即,不使用 Cleartype。这为您提供了质量不错的文本,它看起来比没有任何字体平滑的文本更好。
      猜你喜欢
      • 2011-05-14
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多