我们在利用到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事例中的效果就出来,方便各人用于各种应用上.
|