咱们在利用到WINFORM窗体工作中,要求RichTextBox 参加行号;

  之前有看到大牛们写的,可是太杂乱繁复,而且有效双TextBox举办联动,非常不错,本日咱们实行RichTextBox +Panel相互联动如下效果.

  左边灰色为Panel,右侧为RichTextBox 控件

  1:预备Panel画布如下代码,当接到文件字符后举办坐标分析,制作行号。

  1 private void showLineNo()
  2 {
  3 //获恰当时坐标信息
  4 Point p = this.txtFileView.Location;
  5 int crntFirstIndex = this.txtFileView.GetCharIndexFromPosition(p);
  6
  7 int crntFirstLine = this.txtFileView.GetLineFromCharIndex(crntFirstIndex);
  8
  9 Point crntFirstPos = this.txtFileView.GetPositionFromCharIndex(crntFirstIndex);
  10
  11 p.Y += this.txtFileView.Height;
  12
  13 int crntLastIndex = this.txtFileView.GetCharIndexFromPosition(p);
  14
  15 int crntLastLine = this.txtFileView.GetLineFromCharIndex(crntLastIndex);
  16 Point crntLastPos = this.txtFileView.GetPositionFromCharIndex(crntLastIndex);
  17
  18 //预备绘图
  19 Graphics g = this.panel2.CreateGraphics();
  20
  21 Font font = new Font(this.txtFileView.Font, this.txtFileView.Font.Style);
  22
  23 SolidBrush brush = new SolidBrush(Color.Green);
  24
  25 //绘图开端
  26
  27 //改造画布
  28
  29 Rectangle rect = this.panel2.ClientRectangle;
  30 brush.Color = this.panel2.BackColor;
  31
  32 g.FillRectangle(brush, 0, 0, this.panel2.ClientRectangle.Width, this.panel2.ClientRectangle.Height);
  33
  34 brush.Color = Color.White;//重置画笔颜色
  35
  36 //制作行号
  37
  38 int lineSpace = 0;
  39
  40 if (crntFirstLine != crntLastLine)
  41 {
  42 lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);
  43
  44 }
  45
  46 else
  47 {
  48 lineSpace = Convert.ToInt32(this.txtFileView.Font.Size);
  49
  50 }
  51 int brushX = this.panel2.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);
  52
  53 int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);
  54 for (int i = crntLastLine; i >= crntFirstLine; i--)
  55 {
  56
  57 g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);
  58
  59 brushY -= lineSpace;
  60 }
  61
  62 g.Dispose();
  63
  64 font.Dispose();
  65
  66 brush.Dispose();
  67 }
  View Code
  2:事端预备(启用)如下事端
  控件加载事端
  1 private void txtFileView_TextChanged(object sender, EventArgs e)
  2 {
  3 showLineNo();
  4 }
  View Code
  控件滚动事端(当算出的行数大于本控件长度)
  1 private void txtFileView_VScroll(object sender, EventArgs e)
  2 {
  3 showLineNo();
  4 }
  View Code
  完成后,直接启用运行,Demo案例中的效果就出来,方便各人用于各种应用上.

 

posted on 2020-04-13 15:46  林口  阅读(719)  评论(0编辑  收藏  举报