C#編寫記事本程序(下)——擴展功能

擴展記事本的功能
上次的文章只是給出了編寫記事本的文件裝載及保存的部分,但是對於一個記事本僅僅有基本的功能還是不能滿足人們編輯文本的需要的,這裏就接着上篇博文的內容,對記事本的大部分功能進行擴展。當然,大部分的解釋都在代碼的註釋中,這裏會說幾個值得注意的地方的代碼。同樣文章結束會附上下載完整程序及源碼的鏈接!
最終運行效果部分圖
增加文本編輯功能

支持打印或者PDF

提供查找功能

設計一個About彈窗設計,可以自由發揮!
這裏寫圖片描述

下面就結合代碼對編寫過程中應當注意的問題進行分析:
一、新增加的控件(主要指對話框)
FontDialog //字體對話框
ColorDialog //文本顏色對話框
PrintDocument //打印頁面設置對話框
PrintPreviewDialog //打印預覽對話框
PrintDialog //打印對話框
其餘的就是一些標籤、文本、按鈕等,可自己添加設計。

二、文本編輯功能實現
這裏主要設計右鍵的複製、粘貼、剪切等功能,也就是在上篇文章ContextMenuStrip菜單當中,這個地方很簡單,因爲richTextBox都含有相應的方法,我們只需要給其加鼠標的點擊響應事件即可,如下:

        /// <summary>
        /// 記事本的文本編輯功能實現
        /// </summary>
        /// <param name="..."></param>
        /// <param name="..."></param>
        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            //打開內容菜單響應事件
        }

        private void toolStripMenuItem12_Click(object sender, EventArgs e)
        {
            //用豐富文本框的Cut方法實現剪切功能
            richTextBox1.Cut();
        }

        private void toolStripMenuItem13_Click(object sender, EventArgs e)
        {
            //用豐富文本框的Copy方法實現右鍵複製文本功能
            richTextBox1.Copy();
        }

        private void toolStripMenuItem14_Click(object sender, EventArgs e)
        {
            //用豐富文本框的Paste方法實現右鍵粘貼文本功能
            richTextBox1.Paste();
        }

        private void toolStripMenuItem11_Click(object sender, EventArgs e)
        {
            //用豐富文本框的Undo方法實現右鍵撤銷文本功能
            richTextBox1.Undo();
        }

        private void toolStripMenuItem15_Click(object sender, EventArgs e)
        {
            //用豐富文本框的Redo方法實現右鍵恢復文本功能
            richTextBox1.Redo();
        }

三、實現查找與替換對話框
這個地方的主要思路就是,提取待查找的字符串在文本區中尋找,找到返回其位置,找不到彈出用戶提示。至於替換,就是在查找到的情況下覆蓋原來的字符串。相應的方法都集成在richtextbox中,十分方便,看代碼就很明白。
唯一需要注意的地方是,新建一個Windows窗體,也就是查找和替換的那個小框,怎麼和主窗體配合。解決的方法就是,新窗體的class中的構造函數需要傳一個主窗體類型的對象,然後就可以把主窗體傳到子窗體的執行函數裏,便可以調用主窗體的相關方法。如下:
子窗體的構造函數加一個新的參數

傳當前窗體this

就行上面兩部分那樣相互配合,然後再看源碼中函數的調用關係就十分清晰了。

下面是查找與替換的代碼,這真的沒什麼好說的,確實明白的用註釋足以講得清楚!

/// <summary>
        /// 如下兩個方法將會被formFindReplace類代碼調用
        /// </summary>
        /// <param name="findString/replaceString"></param>
        public void FindRichTextBoxString(string findString)
        {
            //查詢語句代碼實現
            if(findposition >= richTextBox1.Text.Length) 
            {
                //已經查找到文本底部,彈出用戶提示
                MessageBox.Show("已到文本底部,再次查找將回到頂部", "提示", MessageBoxButtons.OK);
                findposition = 0;
                return;
            }
            /* 
             * 下面的代碼進行查找並返回找到的位置,如果未找到則返回-1
             * 參數1是待找的字符串,參數2是查找的開始位置,參數3是查找的
             * 選項,如大小寫是否匹配、查找方向等。
             */
            findposition = richTextBox1.Find(findString, findposition, 
                RichTextBoxFinds.MatchCase);
            if(-1 == findposition) 
            {
                //未找到,彈出用戶提示
                MessageBox.Show("已到文本底部,再次查找將回到頂部", "提示", MessageBoxButtons.OK);
                findposition = 0;
            }
            else
            {
                //成功匹配到查找的字符串
                richTextBox1.Focus();                               //主窗體獲得字符串焦點
                findposition += findString.Length;                  //更新查找位置到當前查找的到的字符串處
            }
        }
        public void ReplaceRichTextBoxString(string findString, string replaceString)
        {
            //替換字符串代碼實現
            if(richTextBox1.SelectedText.Length != 0) 
            {
                //文本框內選中的子串存在,執行替換
                richTextBox1.SelectedText = replaceString;
            }
        }

這兩個函數在子窗體class的鼠標點擊事件裏調用就可以實現查找與替換文本的功能。

四、字體與顏色
這是比較實用和有趣的功能模塊,主要思路就是加對話框控件,之後再響應事件裏展示Dialog即可,代碼十分簡潔!下面拿顏色舉例:

  private void toolStripMenuItem19_Click(object sender, EventArgs e)
        {
            //修改顏色選項響應事件
            if(colorDialog1.ShowDialog() == DialogResult.OK) 
            {
                //顏色對話框彈出成功,修改選中文本的顏色
                richTextBox1.SelectionColor = colorDialog1.Color;
            }
            
        }

五、打印功能的實現
這部分相比其他功能算是最麻煩的一個,因爲打印的過程需要處理的事情比較多,而且文本的打印還需要自己用代碼實現,雖然稍微複雜一些,但是思路還是相當清晰的,打印過程可以把自己的眼睛想象成一個掃描裝置,並且在一行一行、一頁一頁的在掃描紙張。
打印過程中的3個函數:
printDocument1_BeginPrint //打印前執行的函數
printDocument1_PrintPage //打印過程中執行的函數
printDocument1_EndPrint //打印完成後執行的函數
第一個函數主要是初始化打印的字體及文本等,第二個函數相對複雜一些,因爲他需要一行行的掃描,並且判斷文本在當前頁中的位置,還得檢查打沒打印完,但是有了剛纔我的那個比喻,這一切似乎明晰起來!最後一個函數是’善後’工作,對程序打印過程中所佔用的資源進行回收、釋放。

 private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            //打印過程中執行的函數
            float linesPerPage = 0;                                 //記錄每頁的最大行數
            float yPos = 0;                                         //記錄將要打印的一行數據在垂直方向上的位置
            int cnt = 0;                                            //記錄每頁已經打印的行數
            float leftMargin = e.MarginBounds.Left;                 //左邊距
            float topMargin = e.MarginBounds.Top;                   //上邊距
            string line = null;                                     //讀取的的每一行字符將存在line中
            //計算,linesPerPage = 一頁紙打印區域的高度/一行字符的高度
            linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
            //如果當前頁已打印行數小於每頁最大行數而且讀出數據不爲null,繼續打印
            while(cnt < linesPerPage && ((line = streamToPrint.ReadLine()) != null)) 
            {
                yPos = topMargin + (cnt * printFont.GetHeight(e.Graphics));
                //開始打印
                e.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, 
                    yPos, new StringFormat());
                cnt++;
            }
            //是否需要打印下一頁
            if(line != null) 
            {
                e.HasMorePages = true;                              //需要打印下一頁
            }
            else{
                e.HasMorePages = false;                             //不需要打印下一頁
            }
        }

**十分注意!**在編寫打印有個的代碼的時候,必須加上相關的using來支持,沒錯!就是下面那兩個:
using System.IO;
using System.Drawing.Printing;

六、聊一聊Windows窗體設計!
這個應用中有幾個子窗體需要自己設計,C#的可視化編程和控件都使得這一起十分容易,可以讓我們把經歷放到真正的用戶體驗上,這十分偉大。大部分控件的屬性都可以在屬性面板內直接修改(選中相應的控件按F4即可彈出)。如下面這個窗體:
這裏寫圖片描述

屬性面板:
這裏寫圖片描述
點中每一個屬性,下面都會有相應的解釋,這裏設置了其開始出現的位置StartPosition爲母窗體的中心Center Parent;去掉最大化、最小化權限;不允許修改大小等等,只要在此面板裏的都可以修改來看看效果!
好了,其實用C#編寫記事本還是十分方便的,你也可以爲他添加更多的功能,也可以更熟練的使用C#語言來創作新的軟件!
文章中的源代碼及發佈的安裝程序下載鏈接:
鏈接:http://pan.baidu.com/s/1qYC4Tje 密碼:fx1j
聲明:圖片等資源均來源於網絡,僅供學習交流之用!

想一起解決編程中遇到的麻煩嗎?想一起學習更多軟件知識嗎?想找一羣志同道合的朋友嗎?想找到自己關於計算機真正的興趣所在嗎?那就加入我們吧!(老學長公衆號剛剛開通不久,每隔3天會發表一篇有質量的文章,希望大家多支持!)
公衆號:奇妙的coco

發佈了50 篇原創文章 · 獲贊 228 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章