C#自定义RichTextBox加载文件死慢!!
在网上抄了段代码,作用【关闭自动选择字符/生僻字显示】。
测试一下发现加载小文档没问题(秒显),但加载长文档慢得让人抓狂(如加载五笔词库,大概76000+行),要十几二十秒才显示出来,过程就像假死一样。
VS自带的RichTextBox 加载五笔词库大概3秒以内。这个问题出在哪里???
请大神指点优化一下。
测试一下发现加载小文档没问题(秒显),但加载长文档慢得让人抓狂(如加载五笔词库,大概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();
}
...全文
相关推荐
C#中richtextbox使用方法详解
主要介绍了C#中richtextbox使用方法,分析较为详尽,需要的朋友可以参考下
C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色
主要介绍了C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色,通过.NET的静态扩展方法来改变RichTextBox字体颜色,需要的朋友可以参考下
C#在RichTextBox中显示RTF格式文件
摘要:C#源码,文件操作,RichTextBox,RTF C#在RichTextBox中显示RTF格式文件,引用命名空间Using System.IO,学习一下如何使用C#打开RTF文档对象,可以保留一些RTF文档中的文字格式、段落标记等,介于Word与TXT之间的一种文档格式。
C#中实现带有行号的Richtextbox以及其他功能
本程序主要有以下功能: 1.在Richtextbox的旁边没有误差的显示动态行号。 2.可以使Richtextbox的滚动条跳到指定的行号处。 3.可以单击Richtextbox中的某行,然后通过鼠标事件获取鼠标所在的Richtextbox中的行的数据。
C# RichTextbox设置行间距
C# RichTextbox设置行间距


