在代碼顯示的時候,有行號會非常的方便舒服(可能是個人習慣)。
這讓我想到博客園的代碼顯示,添加行號居然是在每一行代碼前添加數字,只能說是下下策,身為處女座的我對此很是不滿,雖然曾經也這樣想過。。
測試:
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。
為什么每次發隨筆最后都帶一張圖呢?我知道沒圖是不會吸引人去看的哈哈。
聲明一下,圖片大多源自網絡【害羞】。