我有一个TLabel
设置EllipsisPosition
为epEndEllipsis
,我需要能够判断文本当前是否被剪辑。除了自己计算显示文本所需的区域并将其与标签的实际尺寸进行比较之外,有没有人想出一种更简单/更优雅的方法来做到这一点?
实际上,以故障安全方式计算所需区域似乎也并不像听起来那么简单……例如TCanvas.GetTextHeight
,不考虑换行符。
TCustomLabel.DoDrawText
在内部使用DrawTextW
或DrawThemeTextEx
与DT_CALCRECT
标志一起确定它是否应该使用省略号。那里涉及到相当多的代码,所有这些都是声明的private
。简单地复制所有这些代码在我的书中并不完全符合“优雅”的条件......
有任何想法吗?
(我正在使用 Delphi 2010,以防有人提出特定于 Delphi 版本的解决方案)
更新 1:我现在发现我可以简单地TCustomLabel.DoDrawText(lRect, DT_CALCRECT)
直接调用(仅声明protected
)让标签执行所需的大小计算,而无需复制其代码。我只需要确保临时设置EllipsisPosition
为epNone
或完全使用临时标签实例。这实际上并没有那么糟糕,如果没有人能想到更简单的解决方案,我可能会接受它。
更新 2:我现在已将我的解决方案添加为单独的答案。事实证明它比我预期的更直接,所以可能没有更简单/更好的方法来做到这一点,但无论如何我都会把这个问题留一段时间,以防万一。