RichTextBox

来源:百度文库 编辑:神马文学网 时间:2024/10/04 02:12:47
RichTextBox的最佳实践

简介
当你在网上搜索插入图片到RichTextBox的方案时,大多数的解决方法是通过拷贝图片到剪贴板,然后粘贴图片到目标RichTextBox中最后清空剪贴板内容。程序如下:
public void InsertImage()
{
...
string lstrFile = fileDialog.FileName;
Bitmap myBitmap = new Bitmap(lstrFile);
// 拷贝位图到剪贴板
Clipboard.SetDataObject(myBitmap);
// 获取对象格式
DataFormats.Format myFormat = DataFormats.GetFormat (DataFormats.Bitmap);
// 验证并粘贴位图
If (NoteBox.CanPaste(myFormat)) {
NoteBox.Paste(myFormat);
}
else {
MessageBox.Show("The data format that you attempted site" +
" is not supportedby this control.");
}
...
}
这并不是一个好的解决方案,因为它在没有提示用户的情况下修改了剪贴板的内容。而其他的方案则是硬编码大量的图形十六进制数据到程序中,但这样做显的很不灵活。对于在运行期插入纯文本到RichTextBox中来说,这些都不是好的解决方案。本文提供的方案能解决以上方案的这些问题。
本方案主要实现以下功能:
1. 允许在运行期以编程的方式插入或追加内容到RichTextBox中。
2. 允许对插入或追加的纯文本进行字体,颜色和高显亮颜色进行修改。
3. 在不通过剪贴板情况下以编程的方式插入图片
RichTextBox的内容即可以是纯文本格式也可以是富文本格式。在下文中所有富文本格式都简称为RTF。
提示:
转换纯文本到RTF是关于追加字符串到创建RTF代码的一个过程。这个过程比较简单,但是需要读者熟悉RTF文档结构和控制字。本文不是一个关于RTF的指南,这里只讨论插入纯文本的议题。因此更多的有关RTF的内容读者需要去阅读源码和RTF指南1.6版。
背景
在进入主题前,明白什么是RTF文档和图元文件是必要的。
RTF文档
RTF是一种结构化文件格式,它通过使用控制字和符号来创建一个应用于不同环境下的文件。当它被阅读时RTF阅读器会转换RTF内容,控制字和符号到格式化的文本。这样就可以很简单以HTML格式显示给用户。在本文中RTF的阅读器是指RichTextBox。
RTF指南是一个有着250个页面的文档,所以不可能将它全部包含到本文中来。本文只介绍在插入图片操作时用到的控制字。完整的RTF文档请参考RTF指南1.6版。
图元文件
在.Net框架中,Image类继承了图元文件类,但是图元文件不是光栅化的图片对象。光栅化的图片对象是由一组矩阵格式的像素点组成的,如位图。图元文件是一个包含了几何方位和绘制命令的向量图像。图元文件可以使用.Net框架的函数转换到位图,但是位图不能在.Net框架中转换到图元文件。因此位图可以被嵌入到图元文件中。
.Net框架提供了两种格式图元文件: windows 图元文件格式(以下简称WMF)和增强图元文件格式 (以下简称EMF)。这些图元文件区别主要是各自不同的绘制命令;EMF比WMF拥有更多的绘制命令。根据微软的文档显示,WMF已不提倡继续使用只是为了向后兼容才保留的,但是本方案还是使用WMF来实现。完整的关于元数据文档可到微软的网站查看。
插入和追加纯文本
插入RTF文本到一个RichTextBox是通过赋值一个字符串给RTF文档到RichTextBox.Rtf属性或是 RichTextBox.SelectedRtf属性来实现的。如果在文本插入的时候已有文本被选中,那么那些文本将被替换。如果没有文本被选中,那么文本将被插入到光标位置。追加文本的代码如下:
/// 追加文本根据给出的字体,颜色,移动光标到尾部并插入
public void AppendTextAsRtf(string _text, Font _font,
RtfColor _textColor, RtfColor _backColor)
{
// 移动光标到文本的尾部
this.Select(this.TextLength, 0);
InsertTextAsRtf(_text, _font, _textColor, _backColor);
}
这里对AppendTextAsRtf有三个重载的方案:
/// 根据当前的字体追加文本并高显亮
public void AppendTextAsRtf(string _text)
{
AppendTextAsRtf(_text, this.Font);
}
/// 根据指定的字体追加文本
public void AppendTextAsRtf(string _text, Font _font)
{
AppendTextAsRtf(_text, _font, textColor);
}
/// 根据指定的字体和颜色追加文本,并高显亮
public void AppendTextAsRtf(string _text, Font _font, RtfColor _textColor)
{
AppendTextAsRtf(_text, _font, _textColor, highlightColor);
}