.net WinForms中使用的所有者绘图文本框

.net WinForms中使用的所有者绘图文本框,.net,windows,winforms,controls,textbox,.net,Windows,Winforms,Controls,Textbox,我需要一个精简的文本框解决方案。RichTextBox的速度太慢了,所以我想采用所有者绘图或自定义控件构建的方式 我需要的是一个文本框,可以处理大的文本内容,并通过在单词或单个字符周围绘制彩色背景来提供简单的高亮显示。重要的是,文本字符串本身不包含标记,而是单独存储要标记的单词的索引。相对于文本字符串开头的索引(在谈论.NET文本框时也称为text属性) 我认为这将涉及到在我自己的控制下绘制文本,因为Windows编辑控件将无法完成我需要的操作 我的应用程序是Windows窗体。制作这样一个控件

我需要一个精简的文本框解决方案。RichTextBox的速度太慢了,所以我想采用所有者绘图或自定义控件构建的方式

我需要的是一个文本框,可以处理大的文本内容,并通过在单词或单个字符周围绘制彩色背景来提供简单的高亮显示。重要的是,文本字符串本身不包含标记,而是单独存储要标记的单词的索引。相对于文本字符串开头的索引(在谈论.NET文本框时也称为text属性)

我认为这将涉及到在我自己的控制下绘制文本,因为Windows编辑控件将无法完成我需要的操作

我的应用程序是Windows窗体。制作这样一个控件的正确方法是什么?有什么例子吗

一个人能在.NET下进行快速控制吗?(已经假设需要本机API调用)。还是C++中更好?


添加1:我认为这样做的方法与用户MarkIsMobile在SO问题中的回答相同。请看,TextBox的OnPaint并不是真正有用的,因为TextBox是一个相当古怪的控件。MarkIsMobile回答中概述的方法如下:

  • 用自己的C#委托替换默认的Windows过程
  • 但仍保留“默认”行为,并调用“OldWindowsProc”
  • 完成此操作后,进行自定义绘图
我自己还没有尝试过这个,但是我有兴趣看到更多的例子


还有。我当前的方法是(相同?)通过NativeWindow类访问控件并重写WndProc。我只需在文本上以一定的透明度绘制,以创建我所追求的“颜色标记”效果,实际上效果很好,但并不完美。(有没有办法用位图混合绘制,只对背景上色,而不对前景中的文本上色?

你无法实际实现自己的文本框,编写自己的文本编辑器是一种惩罚。使用现成的东西,比如闪烁仪

编写自己的可滚动标签有点难。从双缓冲面板开始,使用OnPaint绘制文本。如果不实现word wrap,这将是一种改进,因为必须在滚动的第一条可见行之前包装所有文本,因此计算从何处开始绘制非常昂贵。计算AutoScrollMinSize非常昂贵,因为您必须扫描整个文本以计算换行,请确保不必太频繁地更新文本


一般来说,你很可能只会发现为什么TextBox如此缓慢。通过将文本数量限制在人们可以合理预期的阅读范围内,可以保持其性能。这不算什么。我通过跟踪每个追加的文本长度来完成,当超过65536个字符时,我会扔掉一半。一个不错的整数。

谢谢你的回答。我还没有回复内容,因为我有一段时间在忙其他的事情,但我会在以后详细说明。。。