微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi 6:如何通过TextOut()方法显示大尺寸高质量文本?

我有一个T Image组件,我使用TCanvas.textout()打印文本字符串.我将timage的高度和宽度设置为50像素X(TextWidth)像素的大尺寸,并将Canvas字体高度设置为略小于48像素的高度.然后我将BitBlt()timage的位图放到主Canvas上.我在屏幕上看到的是那些非常粗糙的大字母.我想要的是厚厚的巨型字母,看起来很光滑.使用timage / BitBlt组合的原因是因为我需要动态地调整文本的大小和alpha混合.

对我来说,最简单的方法是将大光滑的字母打印到我的timage位图上?

解决方法

你永远不会展示timage吗?那你应该真的使用屏幕外的位图.这是实现双缓冲(无闪烁渲染)的非常常见的技术.

例如,

var
  bm: TBitmap;

procedure InitOffscreenBitmap;
begin
  bm := TBitmap.Create;
  bm.SetSize(bmWidth,bmHeight);
end;

procedure DrawBitmap;
begin
  // Draw on bm
end;

procedure Swap;
begin
  BitBlt(Canvas.Handle,X,Y,bmWidth,bmHeight,bm.Canvas.Handle,SRCcopY)
end;

如果您使用的是现代版本的Windows(例如Vista)或启用了ClearType的Windows XP(出于某些非常奇怪的原因,认情况下禁用它),则文本应该是平滑的.只需确保使用现代字体.他们中的大多数都会这样做,但是使用ClearType无法平滑MS Sans Serif这样的旧字体.

此外,当然,bm必须与表单具有相同的背景颜色,因为在bm上绘制文本时会发生alpha混合.因此,如果表单是clRed(出于某些不正当的原因),您需要这样做

bm.Canvas.Brush.Color := clRed;
bm.Canvas.Brush.Style := bsSolid;
bm.FillRect(Rect(0,bmHeight));

之前

bm.textout(...)

我们正在谈论同样的事情:这不是很顺利吗?

procedure TForm3.FormPaint(Sender: TObject);
begin
  Canvas.Font.Name := 'Segoe UI';
  Canvas.Font.Height := 64;
  Canvas.textout(10,10,'This is an example.');
end;

Sample Text Output http://privat.rejbrand.se/sampletext.png(High-Res)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐