RichTextBox实现图文并茂

怎么在RichTextBox中插入图片,网上广为流传的方法是,通过剪贴板粘贴的方法,代码如下:

openFileDialog1.Filter = "图片文件|*.jpg|*.bmp|*.png|所有文件|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
     {
         Clipboard.SetDataObject(Image.FromFile(openFileDialog1.FileName), false);
         this.RichTextBox.Paste();
      }

不过,用剪切粘贴实现图片插入显然是偷巧之作,显得别扭还不够灵活。

其实RichTextBox本身处理的是RTF,只要能按照RTF格式的要求对图片文字进行处理,就可以简单的实现图文并茂。何况已经有处理的很好的控件,比如ExRichTextBox

ExRichTextBox实现文本图片的插入,但没有提供链接的支持,尝试添加以下代码:

StringBuilder sb = new StringBuilder();
sb.Append(RTF_HEADER);
sb.Append(@"{/fonttbl{/f0/fnil/fcharset" + Font.GdiCharSet.ToString() + " " + EncodeAnsi(this.Font.Name) + ";}}");
sb.Append(@"/f0/fs" + (int)Math.Round((2 * Font.SizeInPoints)));
sb.Append("{//field{//*//fldinst{HYPERLINK /"");
sb.Append(link.Href);
sb.Append("/" }}{//fldrslt{//cf2//ul ");
sb.Append(EncodeAnsi(link.Value));
sb.Append("}}}");

AppendRtf(sb.ToString());

RTF_HEADER是ExRichTextBox定义的,内容是/rtf1/ansi/ansicpg1252/deff0/deflang,含意大概是说,rft版本1.0,默认编码ansi,codepage英文,使用缺省语言。

之后是设置字体字号,其中fcharset设置很重要,如果设错就会导致中文乱码,这里使用的是控件默认的charset。此外,字号也需要特别指定的,否则使用的默认字体会和其他有所区别。

链接包括URL和标签两部分,标准的写法如上,其中在标签地方特别设置//ul,即该处需要下划线,以便使效果网页类似,当然这里还可以设置颜色。

不过有趣的是,在RichTextBox中,似乎无法显示类似网页链接那样的效果,RichTextBox会自动转换成“标签”的形式,稍显怪异,目前还不知道是设置的问题抑或RichTextBox本身支持的问题,但同样的RTF串在WordPad中则显示正常。

此外,由于在RTF中直接书写中文容易导致乱码,记得吗?RTF头中默认是ansi编码,不过貌似改成unicode也不行,应该是格式的问题。所以特别做了一个转换函数,EncodeAnsi,代码如下:

public string EncodeAnsi(string str)
{
    var sb = new StringBuilder();
    byte[] bs = System.Text.Encoding.Default.GetBytes(str);
    foreach (byte b in bs)
    {
        if (b <= 0x7f)
            sb.Append((char)b);
        else
            sb.Append("//'" + b.ToString("X"));
    }
    return sb.ToString();
}

最后,如果想点击链接的时候触发事件,设置RichTextBox的DetectUrl属性,接收LinkClicked事件就可以了

转自书剑生活

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