我需要一个瘦身和一个意思是TextBox解决方案。 RichTextBox证明太慢,所以我想采用所有者绘图或自定义控件构建的方式。
我需要一个可以处理大型文本内容的文本框,并通过在单词或单个字符周围绘制彩色背景来提供简单的突出显示。重要的是,文本字符串本身不包含此标记,而是要分别存储要标记的单词的索引。相对于文本字符串开头的索引(在谈论.NET TextBox时也称为Text属性)。
我认为它必须涉及在我自己控制下绘制文本,因为Windows编辑控件将无法满足我的需要。
我的应用程序是Windows窗体。制作像这样的控件的正确方法是什么,有没有例子?
可以在.NET下快速控制吗? (已经假定需要本机API调用)。或者这在C ++中做得更好?
添加1:我认为执行此操作的方式与用户MarkIsMobile在SO问题Drawing over a TextBox in .NET Compact Framework中的答案所述。看,TextBox的OnPaint并不是很有用,因为TextBox是一个相当古怪的控件。 MarkIsMobile答案中概述的方法如下:
我自己还没有尝试但是,但有兴趣看到更多这方面的例子。
另外。我当前的方法是(相同?)通过NativeWindow类访问控件并覆盖WndProc。我只是用一定程度的透明度来绘制 over 文本,以创建我所追求的'颜色标记'效果,这实际上很好 - 但并不完美。 (是有哪些方法可以使用位图混合绘制,只对背景进行着色而不是前景中的文本?)
答案 0 :(得分:4)
你无法现实地实现自己的TextBox,编写自己的文本编辑器正在受到惩罚。使用现成的东西,如ScintillaNET。
编写自己的可滚动标签有点可行。从双缓冲面板开始,使用OnPaint绘制文本。如果你没有实现自动换行,它将永远是一个改进,因为你必须在滚动的第一个可见行之前包装所有文本,因此弄清楚从哪里开始绘图是非常昂贵的。计算AutoScrollMinSize是很昂贵的,因为您必须扫描整个文本以计算换行符,确保您不必经常更新文本。
一般来说,你只会发现为什么TextBox和它一样慢的可能性很大。通过将文本数量限制为人们可以合理地预期想要阅读的内容来保持其性能。哪个不多。我这样做是通过跟踪每个追加文本的长度,并在超过65536个字符时抛出一半。一个很好的数字。