C# WinForm 為 RichTextBox 添加行號小技巧


  在代碼顯示的時候,有行號會非常的方便舒服(可能是個人習慣)。

  這讓我想到博客園的代碼顯示,添加行號居然是在每一行代碼前添加數字,只能說是下下策,身為處女座的我對此很是不滿,雖然曾經也這樣想過。。

  測試:

 1 using System;
 2 using System.IO; 
 3 using System.Collections.Generic;
 4 using System.ComponentModel;
 5 using System.Data;
 6 using System.Drawing;
 7 using System.Linq;
 8 using System.Text;
 9 using System.Threading.Tasks;
10 using System.Windows.Forms;

  復制粘貼:

 1 using System;
 2 using System.IO; 3 using System.Collections.Generic; 4 using System.ComponentModel; 5 using System.Data; 6 using System.Drawing; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks; 10 using System.Windows.Forms;

  好在博客園為代碼控件提供了復制代碼功能:

  本人本着不吹不黑的態度,大家不要打我【捂臉】。

  VS里面對於文本顯示,RichTextBox控件並沒有顯示行號這一功能,所以為此發愁的童鞋們可以采取以下方法:
  界面設計:

  控件:Panel,RichTextBox

  在RichTextBox里生成以下函數:

  在函數里調用以下代碼實現在Panel中繪制行號:

        private void showLineNo()
        {
            //獲得當前坐標信息
            Point p = this.richTextBox1.Location;
            int crntFirstIndex = this.richTextBox1.GetCharIndexFromPosition(p);

            int crntFirstLine = this.richTextBox1.GetLineFromCharIndex(crntFirstIndex);

            Point crntFirstPos = this.richTextBox1.GetPositionFromCharIndex(crntFirstIndex);

            p.Y += this.richTextBox1.Height;

            int crntLastIndex = this.richTextBox1.GetCharIndexFromPosition(p);

            int crntLastLine = this.richTextBox1.GetLineFromCharIndex(crntLastIndex);
            Point crntLastPos = this.richTextBox1.GetPositionFromCharIndex(crntLastIndex);

            //准備畫圖
            Graphics g = this.panel1.CreateGraphics();

            Font font = new Font(this.richTextBox1.Font, this.richTextBox1.Font.Style);

            SolidBrush brush = new SolidBrush(Color.Green);

            //畫圖開始

            //刷新畫布

            Rectangle rect = this.panel1.ClientRectangle;
            brush.Color = this.panel1.BackColor;

            g.FillRectangle(brush, 0, 0, this.panel1.ClientRectangle.Width, this.panel1.ClientRectangle.Height);

            brush.Color = Color.White;//重置畫筆顏色

            //繪制行號

            int lineSpace = 0;

            if (crntFirstLine != crntLastLine)
            {
                lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);

            }

            else
            {
                lineSpace = Convert.ToInt32(this.richTextBox1.Font.Size);

            }

            int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);

            int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);//驚人的算法啊!!
            for (int i = crntLastLine; i >= crntFirstLine; i--)
            {

                g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);

                brushY -= lineSpace;
            }

            g.Dispose();

            font.Dispose();

            brush.Dispose();
        }

  在之前生成的函數代碼中調用函數:

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            showLineNo();
        }

        private void richTextBox1_VScroll(object sender, EventArgs e)
        {
            showLineNo();
        }

  顯示:

  雖然效果沒有預期的好,但是簡單易行,MARK。

  為什么每次發隨筆最后都帶一張圖呢?我知道沒圖是不會吸引人去看的哈哈

  聲明一下,圖片大多源自網絡【害羞】

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM