gpt4 book ai didi

delphi - 如何最好地以编程方式判断 TLabel 的标题是否被剪裁(即使用省略号绘制)?

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

我有一个 TLabel,其中 EllipsisPosition 设置为 epEndEllipsis,我需要能够判断文本当前是否被剪切。除了自己计算显示文本所需的面积并将其与标签的实际尺寸进行比较之外,有没有人想出一种更简单/更优雅的方法来做到这一点?

实际上,以自动防故障方式计算所需区域似乎也不像听起来那么简单……例如,TCanvas.GetTextHeight 不考虑换行符。

TCustomLabel.DoDrawText 在内部使用 DrawTextWDrawThemeTextEx 以及 DT_CALCRECT 标志来确定是否它应该使用或不使用省略号。这里涉及到相当多的代码,所有这些代码都被声明为 私有(private)。在我的书中,简单地复制所有这些代码并不完全符合“优雅”的条件......

有什么想法吗?

(我正在使用 Delphi 2010,以防有人提出特定于 Delphi 版本的解决方案)

更新 1: 我现在发现我可以直接直接调用 TCustomLabel.DoDrawText(lRect, DT_CALCRECT) (这只是声明 protected )让标签执行所需的尺寸计算,而无需重复其代码。我只需确保临时将 EllipsisPosition 设置为 epNone 或完全使用临时标签实例。这实际上并没有那么糟糕,如果没有人能想到更简单的解决方案,我可能会选择它。

更新 2:我现在已将我的解决方案添加为单独的答案。事实证明,它比我预期的要简单得多,因此可能没有更简单/更好的方法来做到这一点,但无论如何,我都会把这个问题再留一会儿,以防万一。

最佳答案

FWIW,这就是我的想法(这是自定义 TLabel 后代的方法):

function TMyLabel.IsTextClipped: Boolean;
const
EllipsisStr = '...';
var
lEllipBup: TEllipsisPosition;
lRect: TRect;
begin
lRect := ClientRect;
Dec(lRect.Right, Canvas.TextWidth(EllipsisStr));

lEllipBup := EllipsisPosition;
EllipsisPosition := epNone;
try
DoDrawText(lRect, DT_CALCRECT or IfThen(WordWrap, DT_WORDBREAK));
finally
EllipsisPosition := lEllipBup;
end;
Result := ((lRect.Right - lRect.Left) > ClientWidth)
or ((lRect.Bottom - lRect.Top) > ClientHeight);
end;

由于现在使用与 TCustomLabel.DoDrawText 完全相同的逻辑(尤其是人工填充和正确的 WordWrap 设置),它还可以正确处理多行和自动换行的输入文本。请注意,在这种情况下,“正确”意味着“当使用剪切标题绘制 TLabel 时,它始终返回 True,否则返回 False”。

虽然上面的代码实现了我最初要求的功能,但我可能不会以这种方式使用它 - 但这更多是由于 TLabel 本身的缺点:特别是对于多行文本,它通常不会按照我希望的方式行事,例如当没有足够的空间容纳多行时,即使整行加上省略号已经适合,第一行的最后一个单词也将始终被截断。

关于delphi - 如何最好地以编程方式判断 TLabel 的标题是否被剪裁(即使用省略号绘制)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4313607/

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