1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | editorControl是一个userControl,其包含两个控件:左侧是一个用来显示行号的RichTextBox(使用label等均可),右侧是一个继承自RichTextBox的componenteditorGrid1。 /*实现行号 begin*/ (1) 添加事件 private void richTextBoxMain_TextChanged( object sender, EventArgs e) { updateLabelRowIndex(); } private void richTextBoxMain_FontChanged( object sender, EventArgs e) { updateLabelRowIndex(); richTextBoxMain_VScroll( null , null ); } private void richTextBoxMain_Resize( object sender, EventArgs e) { richTextBoxMain_VScroll( null , null ); } private void richTextBoxMain_VScroll( object sender, EventArgs e) { //move location of numberLabel for amount of pixels caused by scrollbar int p = richTextBoxMain.GetPositionFromCharIndex(0).Y % (richTextBoxMain.Font.Height + 1); labelRowIndex.Location = new Point(0,p); updateLabelRowIndex(); } (2)更新行号的函数 private void updateLabelRowIndex() { //we get index of first visible char and number of first visible line Point pos = new Point(0,0); int firstIndex = this .richTextBoxMain.GetCharIndexFromPosition(pos); int firstLine = this .richTextBoxMain.GetLineFromCharIndex(firstIndex); //now we get index of last visible char and number of last visible line pos.X += this .richTextBoxMain.ClientRectangle.Width; pos.Y += this .richTextBoxMain.ClientRectangle.Height; int lastIndex = this .richTextBoxMain.GetCharIndexFromPosition(pos); int lastLine = this .richTextBoxMain.GetLineFromCharIndex(lastIndex); //this is point position of last visible char, //we'll use its Y value for calculating numberLabel size pos = this .richTextBoxMain.GetPositionFromCharIndex(lastIndex); labelRowIndex.Text = "" ; for ( int i = firstLine; i <= lastLine +1 ; i++) { labelRowIndex.Text += i + 1 + "\r\n" ; } } /*end*/ |