分享

RichTextBox的最佳实践

 nxhujiee 2010-08-15

RichTextBox的最佳实践

来源: 作者:IT168 李斌 2007-12-10 出处:

  
   本文介绍有关RichTextBox的开发技术。程序运行效果如下图:

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);
}





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多