【问题标题】:How to get text position (in pixels) in TMemo?如何在 TMemo 中获取文本位置(以像素为单位)?
【发布时间】:2019-01-26 18:09:48
【问题描述】:

我想在 TMemo 中获取文本 (aWord) 的像素位置/位置。我的代码是这样的:

var
 Size: TSize;
 Pt: Cardinal;
 aWord: string;
 x, y: Integer;
begin
 ...
 Pt := Perform(EM_POSFROMCHAR, aStart-1, 0);
 Windows.GetTextExtentPoint32(DC, PChar(aWord), aLen, Size);
 x:= Smallint(LoWord(Pt));
 y:= Smallint(HiWord(Pt));

最初它工作正常,但是当我向下滚动备忘录时,我在最后一行收到范围检查错误。

向下滚动时如何获取位置?


官方documentation说:

如果字符已经被返回,则返回的坐标可以是负数 滚动到编辑控件的客户区之外。该坐标 被截断为整数值。

我不知道如何解释。

【问题讨论】:

  • LoWordHiWordDWORD 的一半视为无符号数字并返回 0 到 65535 范围内的值。将大于 32767 的值分配给 Smallint 时会出现范围错误。您可以通过直接将LoWord 分配给x 来更正此问题,并手动更正:if x > 32767 then x = x - 65536;

标签: delphi winapi scroll memo tmemo


【解决方案1】:

愚蠢。我的思绪停留在“坐标被截断为整数值”上——我仍然不知道这是什么意思。我正在尝试转换这些坐标。

解决方法很傻:如果我们得到一个负数,就意味着文本在屏幕之外。我们不会尝试提取/转换 Loword 和 HiWord。我们只需退出该过程。


Pt 也应该是“NativeInt”。

【讨论】:

  • 其实Pt应该是LRESULT
猜你喜欢
  • 2011-10-19
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多