C#自定义RichTextBox加载文件死慢!!

茗香淡然 茗香淡然 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在网上抄了段代码,作用【关闭自动选择字符/生僻字显示】。
测试一下发现加载小文档没问题(秒显),但加载长文档慢得让人抓狂(如加载五笔词库,大概76000+行),要十几二十秒才显示出来,过程就像假死一样。

VS自带的RichTextBox 加载五笔词库大概3秒以内。这个问题出在哪里???

请大神指点优化一下。

using System;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace 文件加载速度测试
{
public partial class ExRichTextBox : 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

public ExRichTextBox()
{
InitializeComponent();

moduleHandle = IntPtr.Zero;
attemptedLoad = false;
AutoWordSelection = false;//关闭自动选字词
Font = new System.Drawing.Font(
"宋体", 12.0F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, 0);
/* 文本中出现‘西方语言’用西方字体显示,出现‘亚洲语言’则用亚洲字体显示 */
this.LanguageOption = RichTextBoxLanguageOptions.DualFont;
ShowSelectionMargin = true;
ImeMode = ImeMode.On;
}

public ExRichTextBox(IContainer container)
{
container.Add(this);

InitializeComponent();

moduleHandle = IntPtr.Zero;
attemptedLoad = false;
AutoWordSelection = false;//关闭自动选字词
Font = new System.Drawing.Font(
"宋体", 12.0F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, 0);
ShowSelectionMargin = true;
ImeMode = ImeMode.On;
}

#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 OnMouseDown(MouseEventArgs e)
{
_Selecting = true;
_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
}
}

string str2 = @"D:\Documents\五笔词库20160202.txt";
private void button1_Click(object sender, EventArgs e)
{
exRichTextBox1.Text = File.ReadAllText(str2, Encoding.Default);
//exRichTextBox1.Lines = File.ReadAllLines(str2, Encoding.Default);
}

private void button2_Click(object sender, EventArgs e)
{
exRichTextBox1.Clear();
}
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
茗香淡然
C# 111,128 成员 642,537 内容