加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:16:28 所属栏目:大数据 来源:网络整理
导读:我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本.如果文本被单元格矩形剪切,则必须以省略号结尾.问题是我无法正确计算文本矩形(或者TextRect / DrawText过程无法正常工作,我不确定). 我试着用这种计算文本矩形的方法: var
我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本.如果文本被单元格矩形剪切,则必须以省略号结尾.问题是我无法正确计算文本矩形(或者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”时使用高度降低的矩形指定tfModifyStringin格式化选项,然后调用“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,tfWordBreak,tfModifyString]);

  Inc(TextRect.Bottom);
  Canvas.TextRect(TextRect,tfWordBreak]);

我会留意,如果操作系统的未来版本决定完全剪切最后一行,如果它不完全适合矩形..

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读