【问题标题】:Get pixel coordinates of a word in a Delphi TEdit在 Delphi TEdit 中获取单词的像素坐标
【发布时间】:2012-09-23 17:42:52
【问题描述】:

问候互联网的集体奇迹。

我正在尝试在 TEdit(实际上是来自 Berg NextSuite 的 TNxEdit - 但它是 TEdit 的衍生产品)中为特定单词加下划线。然而,为了做到这一点,我需要知道所说单词的像素坐标。

如果文本的开头可见,这很容易做到,但是如果文本的开头已经滚动到结尾,我不知道该怎么做。

有没有办法直接确定给定单词的精确坐标?如果做不到这一点,确定哪些文本在编辑中可见,哪些不可见?或者其他一些巧妙的方法。

Edit1:涵盖当前的一些答案:

要求是在 TNxGrid 组件的列上实现拼写检查器,这将我限制为 TNxEdit。如果我可以选择我使用的组件,我现在会切换 :(

我可以画线。 TNxEdit 有一个画布,只要我能计算出正确的坐标,我就可以很高兴地绘制下划线。

如果编辑文本的开头可见,即前面没有滚动,那么我可以使用 TextExtent 确定正确的开始位置和行的长度。

问题出现在文本开头滚动到前面的场景中。无法确定从前面滚动了多少意味着我无法计算出该行的起始位置。如果我要突出显示的单词也部分滚动,则行长会成为问题。

【问题讨论】:

  • 也许使用原生支持标记的类似 TRichEdit 的组件更明智。
  • 我会和@GolezTrol一起去这个。只是在这方面做一个微不足道的开始将需要永远。
  • 遗憾的是我不能,否则我早就做了。有问题的表单使用 TNextGrid 组件,并且要求在其中一列的就地编辑器上实现拼写检查器。这意味着它们必须是 TNxEdit 衍生品,而后者又是 TEdit 衍生品。碰巧我可以很容易地绘制(除非我错过了什么),只要我能得到正确的坐标来绘制。

标签: delphi


【解决方案1】:

尝试使用(发送消息)EM_POSFROMCHAR 获取文本特定部分的坐标。例如:

pPoint: TPoint;
SendMessage(Wnd, EM_POSFROMCHAR, WPARAM(@pPoint), charIndex);

但请记住,下划线很可能需要您对控件进行子类化并实现自定义绘制。所以@GolesTrol 提出的建议是值得的,那就是尝试从已经支持所需功能的现有控件中进行选择。

【讨论】:

    【解决方案2】:

    TEdit 是系统 Win32 编辑类的 Delphi 包装器,它不提供任何功能来设置特定单词的下划线属性,TEdit 也没有添加这样的功能。我建议你考虑使用更强大的类,delphi 中的组件,作为 TRichEdit 说,如果您喜欢面对复杂的任务,请尝试计算给定字体的字符串范围(请参阅 GetTextExtentExPoint 和类似内容)以获取行的 x 开始/结束位置,(还可以考虑 Edit 的边框添加一些 x 偏移量)和在 HDC (TCanvas) 上画一条线

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多