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