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