2013-02-25 30 views
8

私は、メモリ内の画像にテキストを描画し、ファイルに書き込む小さなアプリケーションを作成しました。 Delphiの基本的なコードは、次のようになります。Win32 APIを使用してテキストを描画するときにClearTypeの設定を上書きするにはどうすればよいですか?

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オプションがありますか?

答えて

12

テキストのフォントスムージングは​​、デバイスに選択したフォントによって決まります。 raw Win32インターフェイスが提供するオプションについては、LOGFONTのドキュメントを参照してください。

Delphiでは、基礎となるWin32 APIフォントAPIはTFontクラスでラップされています。この質問に関連するプロパティはQualityです。デフォルト値はfqDefaultで、システム全体のフォントスムージング設定を使用します。 QualityfqAntialiasedまたはfqNonAntialiasedに設定するとします。

旧バージョンのDelphiではこのプロパティがありません。その場合は、必要な品質設定でHFONTを作成するにはCreateFontIndirectに電話する必要があります。あなたがテキストを描き始める前に、あなたはすぐに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_QUALITYまたはANTIALIASED_QUALITYのいずれかを渡します。

6

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

フォントはアンチエイリアス処理されることはありません、つまり、フォントスムージングが行われていません。

+4

アンチエイリアス処理された画質を使用することもできます。これは、古いスタイルのアンチエイリアス(つまり、クリアタイプなし)でレンダリングされます。それはあなたにまともな品質のテキストを与えます。このテキストは、フォントのスムージングなしで描画されたテキストよりもよく見えます。 –

関連する問題