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

  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";
        /// MSFTEDIT.DLL(即RichEdit4.1版本)注册的类名是"RICHEDIT50W"
        const string WC_RICHEDITW = "RICHEDIT50W";

        /// 用于表示指针或句柄的平台特定类型。
        private IntPtr moduleHandle;
        /// 获取或设置一个值,通过该值指示是否尝试加载。
        private bool attemptedLoad;
        /// 获取或设置一个值,通过该值指示是否按下鼠标。
        private bool _Selecting = false;
        /// 获取或设置一个值,通过该值指示按下鼠标时的位置。
        private int _StartPosition = 0;

        ///  加载库 
        /// 文件路径
        /// 
        [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 =☆=*=☆=重写控件信息=☆=*=☆=
        /// 重写控件的信息
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                AttemptToLoadNewRichEdit();
                if (moduleHandle != IntPtr.Zero)
                {
                    cp.ClassName = WC_RICHEDITW;
                }
                return cp;
            }
        }

        /// 尝试加载新的丰富的编辑(RichEdit)信息
        void AttemptToLoadNewRichEdit()
        {
            // 检索动态库链接
            if (!attemptedLoad)
            {
                attemptedLoad = true;
                string strFile = Path.Combine(Environment.SystemDirectory, DLL_RICHEDIT);
                moduleHandle = LoadLibrary(strFile);
            }
        }
        #endregion

        #region =☆=*=☆=重写鼠标事件=☆=*=☆=
        /// 重写鼠标移过组件发生事件
        /// 鼠标点击事件
        //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);
        //}

        /// 重写鼠标按下事件
        /// 鼠标点击事件
        protected override void OnMouseDown(MouseEventArgs e)
        {
            _Selecting = true;
            AutoWordSelection = false;/* 关闭自动选字词 此项必须 */
            _StartPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));
            base.OnMouseDown(e);
        }

        /// 重写鼠标释放事件
        /// 鼠标点击事件
        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显示特殊字符的问题
转载请注明以上两位作者出处,尊重原创!!

你可能感兴趣的:(.NET/C#)