ibcadmin 发表于 2019-11-8 09:55:42

C# 控件 RichTextBox 显示行号,并且与Panel相互联动

<p>我们在利用到WINFORM窗体工作中,要求RichTextBox 参加行号;</p>
<p>之前有看到大牛们写的,但是太复杂繁多,而且有效双TextBox举行联动,非常不错,本日我们实行RichTextBox +Panel相互联动如下效果.</p>
<p></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>左侧灰色为Panel,右侧为RichTextBox 控件</p>
<p> </p>
<p>1:准备Panel画布如下代码,当接到文件字符后举行坐标剖析,绘制行号。</p>


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
<p> </p>
<p>2:事故准备(启用)如下事故</p>
<p>控件加载事故</p>


1 private void txtFileView_TextChanged(object sender, EventArgs e)
2         {
3             showLineNo();
4         }

View Code
<p>控件滚动事故(当算出的行数大于本控件长度)</p>


1 private void txtFileView_VScroll(object sender, EventArgs e)
2         {
3             showLineNo();
4         }

View Code
<p>完成后,直接启用运行,Demo事例中的效果就出来,方便各人用于各种应用上.</p>
<p> </p>
页: [1]
查看完整版本: C# 控件 RichTextBox 显示行号,并且与Panel相互联动