zoukankan      html  css  js  c++  java
  • 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。

      为什么每次发随笔最后都带一张图呢?我知道没图是不会吸引人去看的哈哈

      声明一下,图片大多源自网络【害羞】

    
    
  • 相关阅读:
    ios 手势加变形
    ios 懒加载
    [leetCode]1111. 有效括号的嵌套深度
    [leetCode]面试题 08.07. 无重复字符串的排列组合
    [leetCode]46. 全排列
    [leetCode]37. 解数独
    [leetCode]面试题 08.09. 括号
    torch.Tensor 与 numpy.ndarray的相互转化
    [leetCode]93. 复原IP地址
    [leetCode]15. 三数之和
  • 原文地址:https://www.cnblogs.com/HIT-cyz/p/RichTextBox_LineNum_CYZ.html
Copyright © 2011-2022 走看看