标签:
在代码显示的时候,有行号会非常的方便舒服(可能是个人习惯)。
这让我想到博客园的代码显示,添加行号居然是在每一行代码前添加数字,只能说是下下策,身为处女座的我对此很是不满,虽然曾经也这样想过。。
测试:
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。
为什么每次发随笔最后都带一张图呢?我知道没图是不会吸引人去看的哈哈。
声明一下,图片大多源自网络【害羞】。
C# WinForm 为 RichTextBox 添加行号小技巧
标签:
原文地址:http://www.cnblogs.com/HIT-cyz/p/RichTextBox_LineNum_CYZ.html