码迷,mamicode.com
首页 > Windows程序 > 详细

C# WinForm 为 RichTextBox 添加行号小技巧

时间:2015-10-30 20:22:02      阅读:484      评论:0      收藏:0      [点我收藏+]

标签:

  在代码显示的时候,有行号会非常的方便舒服(可能是个人习惯)。

  这让我想到博客园的代码显示,添加行号居然是在每一行代码前添加数字,只能说是下下策,身为处女座的我对此很是不满,虽然曾经也这样想过。。

  测试:

 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!