TCanvas上的"添加"文本渲染?

lyb*_*rko 4 delphi

令我惊讶的是,我发现在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;
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 7

这是因为GDI在绘制文本时应用了一些抗锯齿,使文本看起来更好.这会导致绘制文本外部的一些背景像素在文本附近被涂成红色/红色.下次绘制文本时,如果不清除背景,抗锯齿会使这些偏红的像素变得更红.

您可以将背景清除为Arioch'在其答案中陈述的内容,或者如果您确实需要透明地重复渲染文本,则可以关闭抗锯齿.

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;
Run Code Online (Sandbox Code Playgroud)