RichTextBox语法实时突出显示-禁用重新绘制我需要在用户键入时突出显示我在RichTextBox中找到的任何关键字和坏词,这意味着每次释放编辑键时都会调用该函数。我已经写了这个函数,但是文本框里的文本和光标闪烁得太舒服了。我找到了一个解决方案-在我编辑和格式化文本时禁用RichTextBox重绘自身的能力。但是,我知道这样做的唯一方法是重写“WndProc”函数并拦截(我将要收集的)重绘消息,如下所示:protectedoverridevoidWndProc(refSystem.Windows.Forms.Messagem){if(m.Msg==0x00f){if(paint)base.WndProc(refm);否则m.Result=IntPtr.Zero;}elsebase.WndProc(refm);在我开始突出显示false之前将布尔值“paint”设置为false,完成后将其设置为true。但是正如我所说,我创建的函数必须采用RichTextBox;我不能使用子类。那么,有没有办法禁止从外部自动重绘RichTextBox?这是对RichTextBox类的疏忽。其他控件(如ListBox)支持BeginUpdate和EndUpdate方法来抑制绘制。这些方法生成WM_SETREDRAW消息。RTB其实是支持这个消息的,但是他们忘记添加方法了。只需自己添加即可。Project+AddClass,粘贴下图代码。编译控件并将其从工具箱顶部拖放到窗体上。使用系统;使用System.Windows.Forms;使用System.Runtime.InteropServices;类MyRichTextBox:RichTextBox{publicvoidBeginUpdate(){SendMessage(this.Handle,WM_SETREDRAW,(IntPtr)0,IntPtr.Zero);}publicvoidEndUpdate(){SendMessage(this.Handle,WM_SETREDRAW,(IntPtr)1,IntPtr.Zero);这个。无效();}[DllImport("user32.dll")]privatestaticexternIntPtrSendMessage(IntPtrhWnd,intmsg,IntPtrwp,IntPtrlp);私人常量intWM_SETREDRAW=0x0b;或在更新文本之前/之后直接调用SendMessage。我还没有积累足够的数据来修改汉斯的建议。所以我添加了这个答案,提到可能需要通过调用InvalidateRect来请求重绘。一些开始/结束更新实现在更新锁的最终版本时自动执行此操作。同样在.Net中,控制。可以调用Invalidate()来调用本机InvalidateRect函数。MSDN:最后,应用程序可以调用InvalidateRect函数来重新绘制列表框。请参阅WM_SETREDRAW完成您正在尝试做的事情的最佳选择是创建一个多线程应用程序。您将需要创建一个线程来检查列表中的文本。该线程将它找到的任何实例放入队列中。您还需要创建另一个线程来实际突出显示单词。因为您需要使用BeginInvoke()和Invoke()来更新UI,所以您需要确保调整它的调用速率。我每秒不超过20个。为此,您可以使用以下代码:DateTimelastInvoke=DateTime.Now;如果((DateTime.Now-lastInvoke).TotalMilliseconds>=42){lastInvoke=DateTime.Now;...在此处突出显示...}此线程将检查您的队列中是否需要突出显示或重新突出显示的单词,并将继续检查队列中是否有任何新的更新。希望这是有道理的!以上就是C#学习教程:RichTextBox语法实时高亮-禁用重绘所有分享内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注-本文收藏来自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
