最近做了一个能记笔记的小工具,记笔记则需要一个富文本编辑框,于是就手动写了一个富文本编辑框,设置字体、插入图片这些功能都没问题,最后需要保存编辑好的文本内容时就遇到问题了,本来想放弃的,但用Html做的编辑器实在不好用,于是就想办法获取RichBox的rtf格式内容。RichBox本身没的直接获取RTF格式内容的属性,我于是就采用的属性的get和set方式来操作RTF内容。主要代码如下:
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public string RTFText {
get {
using (MemoryStream ms1 = new MemoryStream()) {
rtbDoc.SaveFile(ms1, RichTextBoxStreamType.RichText);
byte[] buf = ms1.ToArray();
string str = Encoding.Default.GetString(buf);
ms1.Close();
ms1.Dispose();
return str;
}
}
set {
using (MemoryStream ms1 = new MemoryStream()) {
byte[] buf = Encoding.Default.GetBytes(value);
ms1.Write(buf, 0, buf.Length);
ms1.Seek(0, SeekOrigin.Begin);
rtbDoc.LoadFile(ms1, RichTextBoxStreamType.RichText);
ms1.Close();
ms1.Dispose();
}
}
}
完整代码如下:
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace RichTextBoxEx {
public partial class RichTextBoxEx : UserControl {
public RichTextBoxEx() {
InitializeComponent();
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
protected RichTextBox RTBox {
get { return rtbDoc; }
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public string RTFText {
get {
using (MemoryStream ms1 = new MemoryStream()) {
rtbDoc.SaveFile(ms1, RichTextBoxStreamType.RichText);
byte[] buf = ms1.ToArray();
string str = Encoding.Default.GetString(buf);
ms1.Close();
ms1.Dispose();
return str;
}
}
set {
using (MemoryStream ms1 = new MemoryStream()) {
byte[] buf = Encoding.Default.GetBytes(value);
ms1.Write(buf, 0, buf.Length);
ms1.Seek(0, SeekOrigin.Begin);
rtbDoc.LoadFile(ms1, RichTextBoxStreamType.RichText);
ms1.Close();
ms1.Dispose();
}
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string Text {
get {
return rtbDoc.Text;
}
set {
rtbDoc.Text = value;
}
}
private void SelectFontToolStripMenuItem_Click(object sender, System.EventArgs e) {
try {
if (!(rtbDoc.SelectionFont == null)) {
FontDialog1.Font = rtbDoc.SelectionFont;
} else {
FontDialog1.Font = null;
}
FontDialog1.ShowApply = true;
if (FontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
rtbDoc.SelectionFont = FontDialog1.Font;
}
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString(), "Error");
}
}
private void FontColorToolStripMenuItem_Click(object sender, System.EventArgs e) {
try {
ColorDialog1.Color = rtbDoc.ForeColor;
if (ColorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
rtbDoc.SelectionColor = ColorDialog1.Color;
}
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString(), "Error");
}
}
private void BoldToolStripMenuItem_Click(object sender, System.EventArgs e) {
try {
if (!(rtbDoc.SelectionFont == null)) {
System.Drawing.Font currentFont = rtbDoc.SelectionFont;
System.Drawing.FontStyle newFontStyle;
newFontStyle = rtbDoc.SelectionFont.Style ^ FontStyle.Bold;
rtbDoc.SelectionFont = new Font(currentFont.FontFamily, currentFont.Size, newFontStyle);
}
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString(), "Error");
}
}
private void ItalicToolStripMenuItem_Click(object sender, System.EventArgs e) {
try {
if (!(rtbDoc.SelectionFont == null)) {
System.Drawing.Font currentFont = rtbDoc.SelectionFont;
System.Drawing.FontStyle newFontStyle;
newFontStyle = rtbDoc.SelectionFont.Style ^ FontStyle.Italic;
rtbDoc.SelectionFont = new Font(currentFont.FontFamily, currentFont.Size, newFontStyle);
}
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString(), "Error");
}
}
private void UnderlineToolStripMenuItem_Click(object sender, System.EventArgs e) {
try {
if (!(rtbDoc.SelectionFont == null)) {
System.Drawing.Font currentFont = rtbDoc.SelectionFont;
System.Drawing.FontStyle newFontStyle;
newFontStyle = rtbDoc.SelectionFont.Style ^ FontStyle.Underline;
rtbDoc.SelectionFont = new Font(currentFont.FontFamily, currentFont.Size, newFontStyle);
}
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString(), "Error");
}
}
private void tbrFont_Click(object sender, System.EventArgs e) {
SelectFontToolStripMenuItem_Click(this, e);
}
private void tspColor_Click(object sender, EventArgs e) {
FontColorToolStripMenuItem_Click(this, new EventArgs());
}
private void tbrLeft_Click(object sender, System.EventArgs e) {
rtbDoc.SelectionAlignment = HorizontalAlignment.Left;
}
private void tbrCenter_Click(object sender, System.EventArgs e) {
rtbDoc.SelectionAlignment = HorizontalAlignment.Center;
}
private void tbrRight_Click(object sender, System.EventArgs e) {
rtbDoc.SelectionAlignment = HorizontalAlignment.Right;
}
private void tbrBold_Click(object sender, System.EventArgs e) {
BoldToolStripMenuItem_Click(this, e);
}
private void tbrItalic_Click(object sender, System.EventArgs e) {
ItalicToolStripMenuItem_Click(this, e);
}
private void tbrUnderline_Click(object sender, System.EventArgs e) {
UnderlineToolStripMenuItem_Click(this, e);
}
private void tbrFind_Click(object sender, System.EventArgs e) {
frmTextEditerFind f = new frmTextEditerFind(rtbDoc);
f.Show();
}
private void tbrInsertImg_Click(object sender, EventArgs e) {
try {
OpenFileDialog1.Title = "RTE - Insert Image File";
OpenFileDialog1.DefaultExt = "rtf";
OpenFileDialog1.Filter = "PNG Files|*.png|JPEG Files|*.jpg|GIF Files|*.gif|Bitmap Files|*.bmp";
OpenFileDialog1.FilterIndex = 1;
if (OpenFileDialog1.ShowDialog() == DialogResult.OK) {
if (OpenFileDialog1.FileName == "") {
return;
}
string strImagePath = OpenFileDialog1.FileName;
Image img;
img = Image.FromFile(strImagePath);
Clipboard.SetDataObject(img);
DataFormats.Format df;
df = DataFormats.GetFormat(DataFormats.Bitmap);
if (this.rtbDoc.CanPaste(df)) {
this.rtbDoc.Paste(df);
}
}
} catch {
MessageBox.Show("Unable to insert image format selected.", "RTE - Paste", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}