我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本.如果文本被单元格矩形剪切,则必须以省略号结尾.问题是我无法正确计算文本矩形(或者TextRect
我试着用这种计算文本矩形的方法:
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, [tfTop, tfLeft, tfEndEllipsis, tfWordBreak, tfModifyString]); Inc(TextRect.Bottom); Canvas.TextRect(TextRect, Text, [tfTop, tfLeft, tfWordBreak]);
我会留意,如果操作系统的未来版本决定完全剪切最后一行,如果它不完全适合矩形..