And*_*rew 4 delphi drawing text ellipsis drawtext
我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本。如果文本被单元格矩形剪裁,则它必须以省略号结尾。问题是我无法正确计算文本矩形(或者 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]);
Run Code Online (Sandbox Code Playgroud)
裁剪矩形已正确计算,但省略号未出现。
当我将剪切矩形的高度减少 1 个像素时出现省略号:
TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines - 1;
Run Code Online (Sandbox Code Playgroud)
但是我的文本底线的一些像素被剪掉了。
如何正确地做到这一点?
由于 api 仅在最后一行不适合指定的矩形时才放置结束省略号,因此一种解决方法可能是tfModifyString在第一次调用具有降低高度的矩形的“TextRect”时指定格式选项,然后调用“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]);
Run Code Online (Sandbox Code Playgroud)
不过,我会密切注意,以防操作系统的未来版本决定在最后一行不完全适合矩形时完全剪掉它...... :)
| 归档时间: |
|
| 查看次数: |
6538 次 |
| 最近记录: |