我尝试在屏幕上显示格式化文本。首先解析非常简单的 HTML 文本(有 b、u、i 之类的标签),然后使用Canvas.TextOut
函数以适当的位置和字体呈现每个字符。
我注意到的第一件事是,画布上每个单独字符的渲染都相当慢。整个句子的渲染要快得多。很明显,当画布被迫重新绘制时,当表单在屏幕上移动时。
一种解决方案是用均匀的字体对字符进行聚类并立即渲染它们。但是,当格式丰富时,它不会有太大帮助。此外,我需要字符是离散的实体,可以以任何方式呈现。例如,没有 WinAPI 支持文本对齐 taJustify 或块写入...
另一种方法是在位图上渲染,或者明智地使用ClipRect
TCanvas 的属性(我还没有尝试过)。
无论如何,当在 TRichEdit 中显示相同格式的文本时,重绘操作不会造成时间损失。另一个简单的例子是所有主要的浏览器,它们显示大量格式化文本没有问题......他们是否像我一样渲染每个字符,但他们做得更有效???我不知道。
那么你知道一些加速应用程序的方法吗(格式化文本渲染?)。
感谢您的想法...
示例代码:(使TForm尽可能大,用鼠标抓住它并在屏幕下向下拖动它。当你将它向上移动时,你会看到“跳跃”的运动)
procedure TForm1.FormPaint(Sender: TObject);
var i, w, h, j:integer;
s:string;
switch:Boolean;
begin
w:=0;
h:=0;
s:='';
for j:=0 to 5 do
for i:=65 to 90 do s:=s + Char(i);
switch:=False; // set true to see the difference
if switch then
begin
for j:=0 to 70 do begin
for i := 1 to Length(s) do
begin
Form1.Canvas.TextOut(50+ w,h +70 , s[i]);
w:=w + Form1.Canvas.TextWidth(s[i]);
end;
w:=0;
h:=h+15;
end;
end
else
begin
for j:=0 to 70 do begin
Form1.Canvas.TextOut(50+ w,h +70 , s);
w:=w + Form1.Canvas.TextWidth(s); // not optimalized just for comparison
w:=0; // not optimalized just for comparison
h:=h+15;
end;
end;
end;