1. 程式人生 > >DevExpress_常用控件22_RichEditControl

DevExpress_常用控件22_RichEditControl

取出 ogr def ase gin pos base64 加載 解析

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