9

我一直在使用DrawText对于我所有的“矩形文本”输出需求,但是我看不到绘制字符串的方法,例如,每隔一个单词加粗或颜色不同,或者更糟糕的是,随机选择的单词的背景不同. 据我所知,可能没有单一的程序可以做到这一点,我可能错了,这就是这个问题的重点。有人可以指出试图达到这种效果的人可能感兴趣的程序吗?此外,如果我是正确的并且没有简单的方法可以做到这一点,那么推荐的路径是什么?当你开始思考可能由此产生的问题时,我脑海中浮现出每一个单词,然后试图将所有这些单词粘合在一起,这似乎是一场噩梦:

我有delphi xe3;如果有人可以改进我的问题和/或文本的措辞,请这样做。

4

2 回答 2

20

您可以从 VCL 获得一些帮助,因为该TCanvas.TextOut方法x将笔 pos 的坐标增加了输出字符串的宽度:

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.MoveTo(20, 100);

  Canvas.Font.Name := 'Segoe UI';
  Canvas.Font.Color := clMaroon;
  Canvas.Font.Style := [];
  Canvas.Font.Height := 64;
  Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'This ');

  Canvas.Font.Color := clNavy;
  Canvas.Font.Style := [fsBold];
  Canvas.Font.Height := 64;
  Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'is ');

  Canvas.Font.Name := 'Bookman Old Style';
  Canvas.Font.Color := clBlack;
  Canvas.Font.Style := [fsItalic];
  Canvas.Font.Height := 64;
  Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'a ');

  Canvas.Font.Name := 'Courier New';
  Canvas.Font.Color := clSilver;
  Canvas.Font.Style := [];
  Canvas.Font.Height := 64;
  Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'test!');
end;

截屏

无论如何,如果您需要更高级的文本输出例程,为什么不看看DirectWrite呢?

于 2013-04-17T13:38:33.963 回答
2

Have you considered using Richedit with it's rather rich formatting abilities? If you need to draw text on canvas, not in window, then EM_FORMATRANGE message allows to copy graphical representation of formatted text.

于 2013-04-17T13:38:02.997 回答