4

驚いたことに、TCanvas でテキストを繰り返しレンダリングすることは何らかの形で「加算的」であることがわかりました。設定が問題の原因であることは理解していますが、テキストを透過的かつ繰り返し (つまり、イベントで)Canvas.Brush.Style:=bsClearレンダリングする必要があります。OnPaintこれを行った後、テキストは見栄えがよくありません。

どうすればそれを回避できますか?

サンプル コードを次に示します。という名前の TButton を数回クリックすると、その効果を確認できますbtn1

procedure TForm1.btn1Click(Sender: TObject);
begin
Form1.Canvas.Brush.Style:=bsClear; //if you omit this, everything is OK.
Form1.Canvas.Font.Color:=clRed;
Form1.Canvas.Font.Name:='Times new Roman';
Form1.Canvas.Font.Style:=[fsBold];
Form1.Canvas.Font.Size:=12;
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com');
end;
4

2 に答える 2

7

これは、GDI がテキストの描画時にアンチエイリアスを適用して、テキストの見栄えを良くするためです。これにより、描画されたテキストの外側の背景の一部のピクセルが、テキストの近くで赤く/赤みを帯びてペイントされます。次にテキストを描画するときに背景をクリアしないと、アンチエイリアシングによってこれらの赤みがかったピクセルがさらに赤くなります。

Arioch 'Theが彼の回答で述べたように背景をクリアするか、テキストを透過的に繰り返しレンダリングする必要がある場合は、アンチエイリアスをオフにすることができます.

TOndrejは、この回答で、テキスト出力の品質を指定するための優れた機能を提供しています。これを使用すると、コードは次のようになります。

begin
Form1.Canvas.Brush.Style:=bsClear;
Form1.Canvas.Font.Color:=clRed;
Form1.Canvas.Font.Name:='Times new Roman';
Form1.Canvas.Font.Style:=[fsBold];
Form1.Canvas.Font.Size:=12;
SetFontQuality(Form1.Canvas.Font, NONANTIALIASED_QUALITY);  // <--
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com');
end;
于 2012-09-18T08:08:40.793 に答える
3

レンダリングする前に背景をきれいにする必要があります。

そのようなメッセージ/イベントがコントロールによって公開されていない場合は、最後にレンダリングされたテキスト TRect (関数 TCanvas.TextExtent など) を記憶し、次のテキストをレンダリングする前に消去する必要があります。

また、キャンバスの上に透明な TLabel を適切な場所に浮かせておき、必要に応じてそのキャプションを変更することも可能であり、より単純な場合もあります (「汚い」回避策のようなものですが)。

于 2012-09-18T07:33:56.790 に答える