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*/
|