咱們在使用到WINFORM窗體工做中,要求RichTextBox 加入行號;ide
以前有看到大牛們寫的,可是太複雜繁多,並且有用雙TextBox進行聯動,很是不錯,今天咱們嘗試RichTextBox +Panel相互聯動以下效果.this
左側灰色爲Panel,右側爲RichTextBox 控件spa
1:準備Panel畫布以下代碼,當接到文件字符後進行座標解析,繪製行號。3d
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 }
2:事件準備(啓用)以下事件code
控件加載事件blog
1 private void txtFileView_TextChanged(object sender, EventArgs e) 2 { 3 showLineNo(); 4 }
控件滾動事件(當算出的行數大於本控件長度)事件
1 private void txtFileView_VScroll(object sender, EventArgs e) 2 { 3 showLineNo(); 4 }
完成後,直接啓用運行,Demo事例中的效果就出來,方便你們用於各類應用上.it