8

メモリ内の画像にテキストを描画してファイルに書き込む小さなアプリケーションを作成しました。基本的な 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 設定に関係なく、アプリケーションで一貫した出力が必要です (いずれにせよ、出力は画面に直接表示されません)。ローカルの ClearType 設定をオーバーライドするための Win32 API オプションはありますか?

4

2 に答える 2

12

テキストのフォント スムージングは​​、デバイスで選択したフォントによって決まります。生の 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ます。

于 2013-02-25T15:56:14.007 に答える
6

ClearType を使用しない新しい論理フォントを作成できると思います。のパラメータNONANTIALIASED_QUALITYとしてフラグを渡すようにしてください:fdwQualityCreateFont

フォントはアンチエイリアス処理されません。つまり、フォント スムージングは​​実行されません。

于 2013-02-25T15:55:10.510 に答える