none
c# 实现richTextBox带行号 问题严重 请求帮助 RRS feed

  • 问题

  • 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.Green;//重置画笔颜色
         //
         //绘制行号
         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();
    }

    以上方法为绘制行号的方法,将其放在panelpaint方法中

    richtextbox的文本变化和垂直滚动时调用panelInvalidate()方法(不要调用paint,会出现闪烁)

    出现的问题是:

    当我从记事本把文本粘贴到RichTextBox就会出现左上角行号错乱的问题。


    如果是我在RichTextBox控件中直接输入文本则显示是正常的

    大家帮我分析一下这个是什么问题?


    2012年6月5日 11:50

答案

全部回复