在程序中有利用RichTextBox進行一些操作的需求,無意中在CodeProject中發現了一個封裝比較完整的RichTextBox控件(http://www.codeproject.com/KB/edit/csexrichtextbox.aspx),控件封裝的還是不錯,測試界面效果如下:
總體來說,支持各種格式的定義以及圖片的插入,效果還是相當不錯,不過在實際中使用發現,用代碼插入的中文內容會出現亂碼。
解決方法一:
由於本身對RichTextBox的應用以及RTF格式不是很熟悉,搜索很久不得要領,沒有找到好的解決方案,後來發現有一個比較取巧的方法,就是重新利用RichTextBox的機制來生成RTF文檔內容,然後傳入RTF格式內容給控件實現,代碼如下所示:
RichTextBox rtb = new RichTextBox();
rtb.Font = _font;
rtb.Text = _text;
AppendRtf(rtb.Rtf);
上面部分代碼用來替換
public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor, RtfColor _backColor)
函數部分的this.SelectedRtf = _rtf.ToString(); 即可。
修改後完整的函數代碼如下所示:
public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor, RtfColor _backColor) {
StringBuilder _rtf = new StringBuilder();
// Append the RTF header
_rtf.Append(RTF_HEADER);
// Create the font table from the font passed in and append it to the
// RTF string
_rtf.Append(GetFontTable(_font));
// Create the color table from the colors passed in and append it to the
// RTF string
_rtf.Append(GetColorTable(_textColor, _backColor));
// Create the document area from the text to be added as RTF and append
// it to the RTF string.
_rtf.Append(GetDocumentArea(_text, _font));
//this.SelectedRtf = _rtf.ToString();
RichTextBox rtb = new RichTextBox();
rtb.Font = _font;
rtb.Text = _text;
AppendRtf(rtb.Rtf);
}
步驟二:
上面那種方法應該是一種取巧的方法,後來學習了幾篇文章關於RichTextBox格式介紹,發現還可以通過修改裡面的一些編碼格式實現中文的處理效果的。
RichTextBox格式相關的介紹文章如下所示:
RTF文件格式研究報告 (http://www.cnpopsoft.com/article.asp?id=11)
關於RTF(富文本格式)的使用(http://blog.sina.com.cn/s/blog_5d2a73550100bcth.html)
使用C# 編程對RTF 文檔進行操作(http://www.webjx.com/htmldata/2007-10-22/1193038864.html)
使用RichTextBox的一點心得(http://blog.csdn.net/jiangxinyu/archive/2008/06/16/2552150.aspx)
看了以上文章,你會發現,文章介紹的ExRichTextBox控件的編碼頭部內容以及字體內容是設置成了支持英語(美國)以及ASCII碼,所以中文無法顯示正常導致的亂碼,如果修改了RichTextBox的編碼頭部內容和字體內容,應該就沒有問題了。原來的RichTextBox頭部內容如下:
/* RTF HEADER
* ----------
*
* \rtf[N] - For text to be considered to be RTF, it must be enclosed in this tag.
* rtf1 is used because the RichTextBox conforms to RTF Specification
* version 1.
* \ansi - The character set.
* \ansicpg[N] - Specifies that unicode characters might be embedded. ansicpg1252
* is the default used by Windows.
* \deff[N] - The default font. \deff0 means the default font is the first font
* found.
* \deflang[N] - The default language. \deflang1033 specifies US English.
* */
private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033";
如果修改下即可支持中文:
private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052";
因為介紹內容如下:
1、文件基本屬性:
{\rtf1 RTF版本\ansi字符集\ansicpg936簡體中文\deff0默認字體0\deflang1033美國英語\deflangfe2052中國漢語
同樣,把字體部分稍微調整下:
// \fcharset specifies the character set of a font in the font table.
// 0 is for ANSI.
_fontTable.Append(@"\fcharset0 ");
修改後變為以下代碼即可:
// \fcharset specifies the character set of a font in the font table.
// 0 is for ANSI.
//_fontTable.Append(@"\fcharset0 ");
_fontTable.Append(@"\fcharset134 ");
調整後測試效果如下圖所示,同樣可以實現和步驟一的效果:
內容打印:
在以上基礎上,我從別處獲取了關於RichTextBox控件的打印功能代碼,對該控件進行了功能擴充。打印效果如下圖所示:
本文配套源碼