DevExpress_常用控件22_RichEditControl
4、Rich Text Editor
1、RichEditControl控件
該控件可以生成類似Word文檔的文本編輯器,
雖然RichTextBox還是不夠完美,排版的效果比word差太遠,
但好在與word的兼容性不錯,所以通常可在word裏排版,然後復制到 RichTextBox裏
另外, 可以通過CreateBarManger方法自動生成相應的菜單項;
傳統.NET界面也有一個RichTextBox控件,一個富文本控件,可存儲圖片文字,有自己的文件格式RTF,
在DevExpress控件組裏面也有一個同等的控件,RichEditControl,
但是默認它沒有任何工具欄,全部是需要自己添加上去。
下面我們一步步使用這個控件實現自己需要的功能和界面。
期望最終效果如下:
1、如何創建帶工具欄的RichEditControl控件
為了使得控件更加通用,我做了一個自定義控件,用來實現通用文本編輯器的功能,
首先我們創建一個自定義控件,
User Control 如下所示:
這樣我們會看到一個一塵不染的自定義控件界面,
然後再往裏面添加一個RichEditControl進去,
設置Dock = Fill,讓RichEditControl控件鋪滿整個自定義控件界面,
設置器ActiveViewType = Simple(其他兩個是Draft, PrintLayout) 讓控件顯示的更緊湊一些。
如下所示。
從上面我們看到,它默認是沒有任何工具欄的,
選中RichEditControl, 然後再右上角的三角符號上,單擊可以看到有一些功能菜單,
如下所示。
單擊Create BarManager, 然後可以進一步看到更多的工具欄菜單了。
可以先選擇Create All Bar來創建所有工具欄,然後隱藏多余的就可以了(屬性面板Visible設置為false)。
如下所示:
這樣就可以把所有的工具欄全部列出來了。
一般不需要那麽多,隱藏掉多余的(如何隱藏???屬性面板中Visible為false)
這樣就可以精簡到本文開頭的郵件編輯器界面了。
2、如何實現自定義的按鈕功能
按鈕可以隨意隱藏,也可以隨意組合到一個工具欄裏面,
當然,這個控件的工具欄還可以增加自己的按鈕和處理事件喔~
如上面的按鈕,就是用來截圖的一個功能,這個是自定義的,內置的沒有這樣的功能喲,
這樣添加按鈕及圖片後,實現按鈕的事件就可以了,和自己創建的按鈕一樣。
這個截圖功能,實現代碼如下所示。
//full screen capture int i = 0; int w = Screen.PrimaryScreen.Bounds.Width; int h = Screen.PrimaryScreen.Bounds.Height; private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { WindowState = FormWindowState.Minimized; Thread.Sleep(300); i += 1; Bitmap b = new Bitmap(w,h); Graphics graphics = Graphics.FromImage(b); graphics.CopyFromScreen(0, 0, 0, 0, new Size(w, h)); b.Save("C:\\gtzb\\" + i + ".jpg"); WindowState = FormWindowState.Normal; Clipboard.SetImage(b); Cursor = Cursors.Default; }
截圖代碼2:
可對圖片進行區域裁剪
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.XtraEditors; namespace DXApplication_1 { public partial class ScreenCaptureForm : DevExpress.XtraEditors.XtraForm { public ScreenCaptureForm() { InitializeComponent(); } // screen capture 2 int i = 0; Bitmap originBitmap; Bitmap copyOfOriginBitmap; Bitmap croppedBit; int startX; int startY; int endX; int endY; Pen pen = new Pen(Color.Red, 2); Rectangle croppedRectangle = new Rectangle(); Graphics croppedGraphics; private void ScreenCaptureForm_Load(object sender, EventArgs e) { i++; WindowState = FormWindowState.Minimized; FormBorderStyle = FormBorderStyle.None; Cursor = Cursors.Cross; int w = Screen.PrimaryScreen.Bounds.Width; int h = Screen.PrimaryScreen.Bounds.Height; originBitmap = new Bitmap(w,h); Graphics tmpGraphic = Graphics.FromImage(originBitmap); tmpGraphic.CopyFromScreen(0, 0, 0, 0, new Size(w, h)); pictureBox1.Image = originBitmap; originBitmap.Save("C:\\gtzb\\" + i + ".jpg"); WindowState = FormWindowState.Maximized; } private void pictureBox1_Click(object sender, EventArgs e) { } private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { this.Close(); } } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { startX = Math.Abs(e.X); startY = Math.Abs(e.Y); } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Left) { endX = Math.Abs(e.X); endY = Math.Abs(e.Y); Graphics tmpGraphics = pictureBox1.CreateGraphics(); croppedRectangle = new Rectangle(startX, startY, endX - startX, endY - startY); Refresh(); tmpGraphics.DrawRectangle(pen, croppedRectangle); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { copyOfOriginBitmap = (Bitmap)originBitmap.Clone(); croppedBit = new Bitmap(croppedRectangle.Width, croppedRectangle.Height); croppedGraphics = Graphics.FromImage(croppedBit); croppedGraphics.DrawImage(copyOfOriginBitmap, new Rectangle(0, 0, croppedRectangle.Width, croppedRectangle.Height), croppedRectangle, GraphicsUnit.Pixel); pictureBox1.Image = croppedBit; croppedBit.Save("C:\\gtzb\\" + i + ".jpg"); Clipboard.SetImage(croppedBit); } } }
效果如下:
打開保存截圖目錄:
// reveal in finder private void button3_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("C:\\Users\\beyond\\source\\repos\\DXApplication_1"); TopMost = false; this.Cursor = Cursors.Default; }
這個截圖,可以直接把Image插入到RichEditControl裏面,
而不需要另外存儲圖片到文件裏,這也是RichEditControl控件方便之處,
如果要實現插入圖片和加載文檔的方法,
除了使用內置按鈕(推薦)外,其實自己也可以寫事件來實現的,
如下代碼就是實現插入圖片和加載文檔這兩個簡單的功能(一般用不上,看看就好)。
插入圖片代碼如下:
string imagePath = "C:\\Users\\beyond\\source\\repos\\DXApplication_1\\menma_13.png"; this.richEditControl1.Document.InsertImage(this.richEditControl1.Document.CaretPosition, DocumentImageSource.FromFile(imagePath));
加載文檔代碼如下:
private void r_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "load file"; openFileDialog.Filter = "Word2003(*.doc)|*.doc|Word2007(*.docx)|*.docx|RTF(*.rtf)|*.rtf|HTM(*.htm)|*.htm|HTML(*.html)|*.html|All File(*.*)|*.*"; openFileDialog.RestoreDirectory = false; if (openFileDialog.ShowDialog() == DialogResult.OK) { string filePath = System.IO.Path.GetFullPath(openFileDialog.FileName); string ext = Path.GetExtension(filePath); if(ext.EndsWith("htm") | ext.EndsWith("html")) { richEditControl1.Document.LoadDocument(openFileDialog.FileName, DocumentFormat.Html, filePath); return; } if (ext.EndsWith("doc")) { richEditControl1.Document.LoadDocument(openFileDialog.FileName, DocumentFormat.Doc, filePath); return; } if (ext.EndsWith("docx") ) { richEditControl1.Document.LoadDocument(openFileDialog.FileName, DocumentFormat.OpenXml, filePath); return; } if (ext.EndsWith("rtf")) { richEditControl1.Document.LoadDocument(openFileDialog.FileName, DocumentFormat.Rtf, filePath); return; } richEditControl1.Document.LoadDocument(openFileDialog.FileName, DocumentFormat.PlainText, filePath); } }
註意:
如果使用switch & case & default, 則會出現錯誤:
控件無法從最終用例標簽("default")脫離開關
3、RichEditControl的特殊操作
1)文檔字體修正
RichEditControl控件功能是強大,不過一般也需要處理一些特殊的情況,
由於該控件加載的時候,默認字體是方正姚體,感覺不好看,
那麽我們就要在文檔加載的時候,把它的字體修改下,
操作如下所示,修改為新宋體。
// constructor public MyRichEdit() { InitializeComponent(); this.richEditControl1.DocumentLoaded += new EventHandler(richEditControl1_DocumentLoaded); } // document onload void richEditControl1_DocumentLoaded(object sender, EventArgs e) { DocumentRange range = richEditControl1.Document.Range; CharacterProperties cp = this.richEditControl1.Document.BeginUpdateCharacters(range); cp.FontName = "新宋體"; //cp.FontSize = 12; this.richEditControl1.Document.EndUpdateCharacters(cp); }
效果如下:
2)RichEditControl內置圖片資源的解析
RichEditControl控件支持把圖片作為內嵌資源存儲在裏面,
如果要把它作為郵件發送,
眾所周知, 郵件內容雖然是HTML,
但圖片資源需要獨立取出來放到LinkedResource對象,
發送才能顯示,否則不能顯示圖片。
而RichEditControl默認轉換出來的HTML內容,是把圖片作為Base64碼寫到文檔裏面,文檔比較大的。
為了實現把圖片獨立提取出來,需要自定義一個該控件的解析類RichMailExporter,
代碼如下所示。
(Sorry 實在編不下去了...)
DevExpress_常用控件22_RichEditControl