private void showLineNo()
{
//获得当前坐标信息
Point p = this.richTextBox1.Location;
int crntFirstIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntFirstLine = this.richTextBox1.GetLineFromCharIndex(crntFirstIndex);
Point crntFirstPos = this.richTextBox1.GetPositionFromCharIndex(crntFirstIndex);
//
p.Y += this.richTextBox1.Height;
//
int crntLastIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntLastLine = this.richTextBox1.GetLineFromCharIndex(crntLastIndex);
Point crntLastPos = this.richTextBox1.GetPositionFromCharIndex(crntLastIndex);
//
//
//准备画图
Graphics g = this.panel1.CreateGraphics();
Font font = new Font(this.richTextBox1.Font,this.richTextBox1.Font.Style);
SolidBrush brush = new SolidBrush(Color.Green);
//
//
//画图开始
//刷新画布
Rectangle rect = this.panel1.ClientRectangle;
brush.Color = this.panel1.BackColor;
g.FillRectangle(brush, 0, 0, this.panel1.ClientRectangle.Width,this.panel1.ClientRectangle.Height);
brush.Color = Color.Green;//重置画笔颜色
//
//绘制行号
int lineSpace = 0;
if (crntFirstLine != crntLastLine)
{
lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);
}
else
{
lineSpace = Convert.ToInt32(this.richTextBox1.Font.Size);
}
int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);
int brushY = crntLastPos.Y+ Convert.ToInt32(font.Size*0.21f);//惊人的算法啊!!
for (int i = crntLastLine; i >= crntFirstLine;i-- )
{
g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);
brushY -= lineSpace;
}
g.Dispose();
font.Dispose();
brush.Dispose();
}以上方法为绘制行号的方法,将其放在panel的paint方法中
当richtextbox的文本变化和垂直滚动时调用panel的Invalidate()方法(不要调用paint,会出现闪烁)
出现的问题是:
当我从记事本把文本粘贴到RichTextBox就会出现左上角行号错乱的问题。如果是我在RichTextBox控件中直接输入文本则显示是正常的
大家帮我分析一下这个是什么问题?richtextbox和panel都是动态创建的
{
//获得当前坐标信息
Point p = this.richTextBox1.Location;
int crntFirstIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntFirstLine = this.richTextBox1.GetLineFromCharIndex(crntFirstIndex);
Point crntFirstPos = this.richTextBox1.GetPositionFromCharIndex(crntFirstIndex);
//
p.Y += this.richTextBox1.Height;
//
int crntLastIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntLastLine = this.richTextBox1.GetLineFromCharIndex(crntLastIndex);
Point crntLastPos = this.richTextBox1.GetPositionFromCharIndex(crntLastIndex);
//
//
//准备画图
Graphics g = this.panel1.CreateGraphics();
Font font = new Font(this.richTextBox1.Font,this.richTextBox1.Font.Style);
SolidBrush brush = new SolidBrush(Color.Green);
//
//
//画图开始
//刷新画布
Rectangle rect = this.panel1.ClientRectangle;
brush.Color = this.panel1.BackColor;
g.FillRectangle(brush, 0, 0, this.panel1.ClientRectangle.Width,this.panel1.ClientRectangle.Height);
brush.Color = Color.Green;//重置画笔颜色
//
//绘制行号
int lineSpace = 0;
if (crntFirstLine != crntLastLine)
{
lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);
}
else
{
lineSpace = Convert.ToInt32(this.richTextBox1.Font.Size);
}
int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);
int brushY = crntLastPos.Y+ Convert.ToInt32(font.Size*0.21f);//惊人的算法啊!!
for (int i = crntLastLine; i >= crntFirstLine;i-- )
{
g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);
brushY -= lineSpace;
}
g.Dispose();
font.Dispose();
brush.Dispose();
}以上方法为绘制行号的方法,将其放在panel的paint方法中
当richtextbox的文本变化和垂直滚动时调用panel的Invalidate()方法(不要调用paint,会出现闪烁)
出现的问题是:
当我从记事本把文本粘贴到RichTextBox就会出现左上角行号错乱的问题。如果是我在RichTextBox控件中直接输入文本则显示是正常的
大家帮我分析一下这个是什么问题?richtextbox和panel都是动态创建的
我建议你不要主动的去“画”这个行号,而要采取一种更自然的方式。比如旁边用一个小细Panel承载行号来同步滚动。
还有,不要用RichTextBox,这个东东能调字体字号,每一行都可能不一样高。那个时候你如何计算行号?
请问bwangel 小细Panel这里具体怎么弄(有没有例子),如果不用RichTextBox那么用啥控件。
它不但支持行号显示,还支持语法着色,看你里面填写的是代码,那就正需要这么一个控件。