我的问题不是基于语言或基于操作系统。我想每个系统都提供某种TextOut(text,x,y)方法。我正在寻找一些指导或文章我应该如何实现选择的输出文本。找不到任何关于此的信息。
我唯一想到的就是这样:
当用户点击文本画布上的某个点时,我知道此点的坐标。我需要计算它在文本缓冲区中的确切位置。所以我从缓冲区的开头遍历,我将每个字符(或文本块)应用于一个样式(如果有的话)。在此之后,我知道在给定风格之后,这封信给出了大小。我将其宽度和高度添加到先前计算的X,Y坐标。通过这种方式,我遍历缓冲区,直到计算出的位置没有达到用户点击的点。在我到达某个偏移范围内的点之后,我有选择的起点。
这是基本的想法。我不知道这是不是很好,我想知道这是如何实现的,例如在Firefox中。我知道我可以浏览消息来源,如果我没有选择,我会这样做。但首先我想找一些关于它的文章......
答案 0 :(得分:1)
选择文本本质上特定于包含它的控件以及存储该文本的方法。
一个非常简单(尽管效率低下的方法)是运行您在单击某个点时使用的文本流算法,并在到达最接近该点的算法时停止算法。更高级的控件可以缓存文本布局以进行选择或更有效地绘制其内容。根据您对CPU时间或内存的重视程度,有多种方法可以使用缓存和特殊情况来使这种“命中测试”更便宜。
如果你可以做任何断言(控件中只有一个字体,所以每一行都有相同的高度)那么可以通过用行索引字体布局然后做简单的算术找出哪个来使这些测试更便宜线被点击了。如果您的文本控件也使用等宽字体(每个字符占据相同的宽度和高度),那么您会更幸运,因为您可以通过查找表和两个简单的分区直接跳转到字符信息。
请记住,从头开始编写文本控件非常困难。为了最佳实践,您应该将文档的内容与显示信息分开。这样做的原因是因为文本本身需要经常编辑,因此可以在数据端采用诸如Ropes或Gap Buffers之类的算法来提供插入符号周围的更快插入。每次编辑文本时,还必须渲染文本,这涉及获取数据并通过某种格式化/流程算法运行它以确定如何向用户显示文本。 这两方面都需要许多算法,这些算法可能会让人烦恼。
不幸的是,使用原生TextOut函数对您没有帮助。您将需要使用为您提供单个字符的文本范围的方法,而更高级(例如多行)控件通常必须使用此信息自己渲染字符。像TextOut这样的函数不是为了处理闪烁的插入符号而构建的,或者是对文本布局执行增量更新。虽然一些TextOut样式函数可能支持自动换行和对齐,但它们还需要重新呈现整个字符串,这与您在控件中需要使用的文本量成比例地变得更不受欢迎。
答案 1 :(得分:0)
你的思维水平远低于必要水平(不是侮辱。你认为你需要做更多的工作然后你需要)。大多数(如果不是全部)支持GUI的语言也会有某种形式的selectionRange,它会为您提供所选的字符串或字符串中的起始和终止索引。
使用现代语言,您永远不必计算像素和字符宽度。
要在Javascript中选择文字,请参阅此问题:Understanding what goes on with textarea selection with JavaScript