C#RichTextBox[自动选词]与[生僻字显示]问题

来源:互联网 发布:阿里云幕布ps能过么 编辑:程序博客网 时间:2024/06/08 14:44

  RichTextBox 的自动选词原系统设置默认打开的,如果我们有一个字符串为:“string数组”,想要选择“g数”这个字符时,RichTextBox已经为我们选择了“string数”字符。

  想要关闭自动选词,在[设计]AutoWordSelection属性设置是没办法关闭的,这算一个小BUG吧。

只能如下面这样才可以关闭。

private void Form1_Load(object sender, EventArgs e){      richTextBox1.AutoWordSelection = false;}

  生僻字(或特殊符号),很多时候都用不到,像这样这里写图片描述
  这两个字都变成����了。
  这些我们都需要用到重写方法。
  

using System;using System.ComponentModel;using System.Runtime.InteropServices;using System.Windows.Forms;using System.IO;namespace 空间名{    public partial class EsRichTextBox : RichTextBox    {        #region =☆=*=☆=自定义变量=☆=*=☆=        const string DLL_RICHEDIT = "msftedit.dll";        /// <summary>MSFTEDIT.DLL(即RichEdit4.1版本)注册的类名是"RICHEDIT50W"</summary>        const string WC_RICHEDITW = "RICHEDIT50W";        /// <summary>用于表示指针或句柄的平台特定类型。</summary>        private IntPtr moduleHandle;        /// <summary>获取或设置一个值,通过该值指示是否尝试加载。</summary>        private bool attemptedLoad;        /// <summary>获取或设置一个值,通过该值指示是否按下鼠标。</summary>        private bool _Selecting = false;        /// <summary>获取或设置一个值,通过该值指示按下鼠标时的位置。</summary>        private int _StartPosition = 0;        /// <summary> 加载库 </summary>        /// <param name="libname">文件路径</param>        /// <returns></returns>        [DllImport("Kernel32.dll")]        internal static extern IntPtr LoadLibrary(string libname);        #endregion        #region =☆=*=☆= 系统构造函数 =☆=*=☆=        public EsRichTextBox()        {            InitializeComponent();        }        public EsRichTextBox(IContainer container)        {            container.Add(this);            InitializeComponent();            moduleHandle = IntPtr.Zero;            attemptedLoad = false;            AutoWordSelection = false;//关闭自动选字词            Font = new System.Drawing.Font(                "宋体", 11.75F, System.Drawing.FontStyle.Regular,                System.Drawing.GraphicsUnit.Point, 0);        }        #endregion        #region =☆=*=☆=重写控件信息=☆=*=☆=        /// <summary>重写控件的信息</summary>        protected override CreateParams CreateParams        {            get            {                CreateParams cp = base.CreateParams;                AttemptToLoadNewRichEdit();                if (moduleHandle != IntPtr.Zero)                {                    cp.ClassName = WC_RICHEDITW;                }                return cp;            }        }        /// <summary>尝试加载新的丰富的编辑(RichEdit)信息</summary>        void AttemptToLoadNewRichEdit()        {            // 检索动态库链接            if (!attemptedLoad)            {                attemptedLoad = true;                string strFile = Path.Combine(Environment.SystemDirectory, DLL_RICHEDIT);                moduleHandle = LoadLibrary(strFile);            }        }        #endregion        #region =☆=*=☆=重写鼠标事件=☆=*=☆=        /// <summary>重写鼠标移过组件发生事件</summary>        /// <param name="e">鼠标点击事件</param>        //protected override void OnMouseMove(MouseEventArgs e)        //{        //    if (_Selecting)        //    {        //        int charPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));        //        int length = 0;        //        if (charPosition >= _StartPosition)        //        {        //            length = charPosition - _StartPosition + 1;        //            Select(_StartPosition, length);        //        }        //        else        //        {        //            length = _StartPosition - charPosition;        //            Select(charPosition, length);        //        }        //    }        //    base.OnMouseMove(e);        //}        /// <summary>重写鼠标按下事件</summary>        /// <param name="e">鼠标点击事件</param>        protected override void OnMouseDown(MouseEventArgs e)        {            _Selecting = true;            AutoWordSelection = false;/* 关闭自动选字词 此项必须 */            _StartPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));            base.OnMouseDown(e);        }        /// <summary>重写鼠标释放事件</summary>        /// <param name="e">鼠标点击事件</param>        protected override void OnMouseUp(MouseEventArgs e)        {            AutoWordSelection = false;/* 关闭自动选字词 此项必须 */            _Selecting = false;            base.OnMouseUp(e);            if (_Selecting)            {                int charPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));                int length = 0;                if (charPosition > _StartPosition)                {                    length = charPosition - _StartPosition;                    Select(_StartPosition, length);                }                else if (charPosition < _StartPosition)                {                    length = _StartPosition - charPosition;                    Select(charPosition, length);                }            }        }        #endregion    }  }

测试的时间,重写的鼠标移动事件使选中的时候一直闪烁,所以把事件内容移到鼠标释放事件中。
以上代码根据 [博客园-huobaby]
关闭 RichTextBox 中 AutoWordSelection 的自动选词功能
[CSDN-cadcisdhht-何海涛的专栏]
RichTextBox显示特殊字符的问题
转载请注明以上两位作者出处,尊重原创!!

0 0