【问题标题】:How do I use DrawText DT_CALCRECT properly?如何正确使用 DrawText DT_CALCRECT?
【发布时间】:2013-05-02 16:28:21
【问题描述】:

我正在生成一个在页脚中有标题的报告。我使用 DrawText 找出标题的尺寸。问题是文本总是被剪裁,但是当我在文本末尾有回车时,所有文本都完美显示。

lClientRect := Rect(0, 0, 4770, 59);
lFlags := DT_CALCRECT or DT_EXPANDTABS or Alignments[Alignment]
       or WordWraps[WordWrap] or DT_NOPREFIX or DT_TOP or DT_EXTERNALLEADING;

DrawText(lCanvas.Handle, PChar(lsCaption), Length(lsCaption), lClientRect, lFlags);

我在调用 DrawText 后检查了 rect,它是 (0, 0, 4366, 59),但是当我有回车时,它是 (0, 0, 4366, 118)。

我不知道发生了什么。任何帮助将不胜感激。

【问题讨论】:

标签: delphi winapi drawtext


【解决方案1】:

回车将第二行文本添加到字符串中,从而将计算出的矩形的高度加倍。 (Windows 对于换行符或回车符是否开始新行是灵活的。)

至于为什么文本被剪裁(我假设在底部边缘),可能是您使用与绘制文本时不同的字体来计算大小。

【讨论】:

  • 我认为你完全错过了 OP 的观点。他想以两倍高度为代价来减小宽度。
  • 你是什么意思,@User?在这两种情况下,矩形的宽度都会减小(从 4770 到 4366)。唯一不同的输出是高度,我认为它可以通过不同数量的文本来充分解释。在这种情况下,使用计算出的高度来定位用于绘制的文本不会剪裁底部,因为可用高度是原来的两倍。事实上,在这种情况下,第二行被剪掉了,但由于第二行是空白的,所以很难注意到。
  • 我不清楚添加 CR 的全部目的,因为结果宽度是相同的
  • 我认为没有目的,@User。最后的额外字符可能是偶然的,但随着它的出现,Jeeva 观察到程序的行为方式与最初预期的方式相同。我的假设是 4366 足以表示一行上的所有文本。无论如何,我认为我们没有理由期望终端回车会影响任何文本的宽度。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2023-03-26
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2017-02-07
相关资源
最近更新 更多