在Delphi TEdit中获取单词的像素坐标

在Delphi TEdit中获取单词的像素坐标,delphi,Delphi,问候互联网上的神奇人物 我试图在TEdit(实际上是来自Berg NextSuite的TNxEdit,但它是TEdit的派生版本)中的特定单词下面划线。然而为了做到这一点,我需要知道所说单词的像素坐标 如果文本的开头是可见的,那么这是相当容易做到的,但是如果文本的开头已经从末尾滚动出去,我就无法解决如何做到这一点 有没有办法直接确定给定单词的精确坐标?如果失败,确定哪些文本在编辑中可见,哪些不可见?或者其他一些巧妙的方法 编辑1:要涵盖当前的一些答案: 需求是在TNxGrid组件的一列上实现拼写

问候互联网上的神奇人物

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

如果文本的开头是可见的,那么这是相当容易做到的,但是如果文本的开头已经从末尾滚动出去,我就无法解决如何做到这一点

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

编辑1:要涵盖当前的一些答案:

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

我可以画这条线。TNxEdit有一块画布,只要我能算出正确的坐标,我就可以很愉快地画下划线

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


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

TEdit是用于系统Win32编辑类,它不提供任何设置一个特定单词下划线属性的功能,也没有TIDIT添加这样一个特性。我建议你考虑使用一个更强大的类,Delphi中的组件,作为TrHeHeDIT。 如果您喜欢面对复杂的任务,请尝试计算给定字体的字符串范围(参见GETTrExtTeNeXeXPoT和类似)以获得该行的X开始/结束位置,(也考虑编辑的边框添加一些X偏移)并在HDC(TCANVAS)上画一条线< /P> < P>尝试使用(发送消息)用于获取文本特定部分的坐标。例如:

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

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

也许更明智的做法是使用一个类似于TRichEdit的组件,它本机支持ts加价。我会选择@GolezTrol。只是在这方面做一个微弱的开始将永远需要。遗憾的是,我不能,或者我已经做了。讨论中的表单使用了TNextGrid组件,要求在inplace编辑器中为其中一列实现拼写检查。这意味着它们必须是TNxEdit派生,这是反过来,只要我能得到正确的坐标,我就可以很容易地画出来(除非我错过了一些东西)。