none
拦截RichTextBox控件TextChanged事件 RRS feed

  • 问题

  • 各位好,以下语句

     RichTextBox.[Select](intStart, intEnd - intStart)
    RichTextBox.SelectionBackColor = 背景色
      RichTextBox.SelectionColor = 普通字颜色
    不知道怎么回事会进入RichTextBox控件的TextChanged消息,

    当单步运行时,执行完,RichTextBox.[Select](intStart, intEnd - intStart)这条选择文字时

    再执行RichTextBox.SelectionBackColor = 背景色和RichTextBox.SelectionColor = 普通字颜色

    2条语句都会进入TextChanged,每次进入TextChanged事件,控件就会自动增加一个撤销的动作

    会导致撤销功能的混乱,当去掉RichTextBox.[Select](intStart, intEnd - intStart)这条选择文字,程序正常

    所以我想再系统接收到TextChanged事件前拦截,然后根据标志,选择让不让系统继续处理TextChanged.

    或者RichTextBox控件有无关闭自动撤销和恢复的功能,程序跟使用的net版本无关

    2013年1月5日 12:08

答案

全部回复

  • 或者哪位知道TextChanged是对应的一下的哪个消息,我想系统的钩子

    Public Const WH_CALLWNDPROC = 4 '发给窗口的消息.线程或系统
     Public Const WH_CALLWNDPROCRET = 12 '窗口返回的消息.线程或系统
        Public Const WH_CBT = 5 '窗口变化、焦点设定等消息.线程或系统
        Public Const WH_DEBUG = 9 '是否执行其它hook的hook.线程或系统
        Public Const WH_FOREGROUNDIDLE = 11 '前台程序空闲 .线程或系统
        Public Const WH_GETMESSAGE = 3 '投放至消息队列中的消线程或系统
        Public Const WH_HARDWARE = 8
        Public Const WH_JOURNALPLAYBACK = 1 '将所记载的消息进行回放系统
        Public Const WH_JOURNALRECORD = 0 '监视并记录输入消息系统
        Public Const WH_KEYBOARD = 2 '键盘消息.线程或系统
        Public Const WH_KEYBOARD_LL = 13
        Public Const WH_MOUSE = 7 '鼠标消息.线程或系统
        Public Const WH_MOUSE_LL = 14
        Public Const WH_MSGFILTER = (-1) '菜单滚动条、对话框消息.线程或系统
        Public Const WH_SHELL = 10 '外壳程序的消息.线程或系统
        Public Const WH_SYSMSGFILTER = 6 '所有线程的菜单滚动条、对话框消息系统

       
    • 已编辑 racenjian 2013年1月5日 12:53 文字输入位置错误和增加文字
    2013年1月5日 12:52
  • @所以我想再系统接收到TextChanged事件前拦截,然后根据标志,选择让不让系统继续处理TextChanged.

    RichTextBox继承了TextBoxBase,而TextBoxBase重写了OnTextChanged方法。因此除非你重写这个类,方可去除TextBoxChanged事件。

    protected override void OnTextChanged(EventArgs e)
    {
        CommonProperties.xClearPreferredSizeCache(this);
        base.OnTextChanged(e);
    }
    尝试注释掉base……这一句。或者自行处理代码。


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心


    2013年1月5日 13:10
    版主
  • 谢谢,我把它转换成vb.net试试,不知道能不能重写OnTextChanged(EventArgs e),我试过重写override TextChanged 系统提示不能重写,需要去掉override
    2013年1月5日 13:19
  •  转换成vb.net代码是不是这句,这句设断点进不去,没有用, 

    Protected Overrides Sub OnTextChanged(e As EventArgs)
            MyBase.OnTextChanged(e)
        End Sub

    2013年1月5日 13:23
  • 你提供了解决方向,我自己再想办法试试,谢谢,控件名_OnTextChanged(e As EventArgs)

    事件前面加上控件名后提示,错误 1 sub“控件名_OnTextChanged”不能声明为“Overrides”,因为它不重写基 class 中的 sub。


    • 已编辑 垃圾邮件筛选器 2013年1月5日 13:39 增加文字
    2013年1月5日 13:27
  • 兄弟可以了,谢谢,加句,把自定义的控件,继承自RichTextBox,就可以了,非常感谢,这个问题我搞了,3天终于好了
    2013年1月5日 15:26