gpt4 book ai didi

Delphi:如何以请求的宽度和行数绘制一些文本,并以省略号结尾?

转载 作者:行者123 更新时间:2023-12-03 15:27:51 25 4
gpt4 key购买 nike

我需要在具有固定宽度(以像素为单位)和固定文本行数的表格单元格中绘制一些文本。如果文本被单元格矩形剪切,则它必须以省略号结尾。问题是我无法正确计算文本矩形(或者 TextRect/DrawText 过程无法正常工作,我不确定)。

我尝试使用这种计算文本矩形的方法:

var
TextRect: TRect;
tm: TEXTMETRIC;
...
GetTextMetrics(Canvas.Handle, tm);
TextLineHeight := tm.tmHeight + tm.tmExternalLeading;

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines;
Canvas.TextRect(TextRect, 'some long long long text',
[tfTop, tfLeft, tfEndEllipsis, tfWordBreak]);

剪切矩形已正确计算,但省略号未出现。

当我将剪切矩形的高度减少 1 个像素时出现省略号:

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines - 1;

但是我的文本底线的一些像素被剪掉了。

如何正确地做到这一点?

最佳答案

由于 API 仅当最后一行不适合指定的矩形时才会放置结束省略号,因此一种解决方法可能是在第一次调用“TextRect”时在格式选项中指定 tfModifyString高度减小的矩形,然后使用适当大小的矩形和修改后的文本再次调用“TextRect”:

var
Text: string;
...

Text := 'some long long long text';
SetLength(Text, Length(Text) + 4); // as per DrawTextEx documentation

Dec(TextRect.Bottom);
Canvas.TextRect(TextRect, Text,
[tfTop, tfLeft, tfEndEllipsis, tfWordBreak, tfModifyString]);

Inc(TextRect.Bottom);
Canvas.TextRect(TextRect, Text, [tfTop, tfLeft, tfWordBreak]);


不过,我会密切关注,以防 future 版本的操作系统决定将最后一行完全剪掉(如果它不完全适合矩形)。:)

关于Delphi:如何以请求的宽度和行数绘制一些文本,并以省略号结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5535316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com