我正在编写文本编辑器,我想知道是否有更快/更可靠的方法来执行这些功能。我在这里写的是最好的,我认为我能做到并且可以做到,除了我有一种感觉,FirstVisibleLine和LineCount已经完成,但VisibleLines可以更快地返回......?
VisibleLines应返回文本区域中可见的文本行数。 FirstVisibleLine应返回文本区域中的第一个可见行 LineCount应返回文本区域中的行数
private int VisibleLines()
{
int topIndex = this.GetCharIndexFromPosition(new Point(0, 0));
int bottomIndex = this.GetCharIndexFromPosition(new Point(0, this.Height - 1));
int topLine = this.GetLineFromCharIndex(topIndex);
int bottomLine = this.GetLineFromCharIndex(bottomIndex);
return bottomLine - topLine;
}
private int FirstVisibleLine()
{
return this.GetLineFromCharIndex(this.GetCharIndexFromPosition(new Point(0,0)));
}
public int LineCount
{
get
{
Message msg = Message.Create(this.Handle, EM_VISIBLELINES, IntPtr.Zero, IntPtr.Zero);
base.DefWndProc(ref msg);
return msg.Result.ToInt32();
}
}
答案 0 :(得分:2)
您可以通过向文本框发送消息来获取第一条可见行,以获取第一行,而不是使用GetCharIndexFromPosition
和GetLineFromCharIndex
一次。我不确定为什么TextBox(或TextBoxBase)类没有实现它。
private const int EM_GETFIRSTVISIBLELINE = 206;
private int GetFirstVisibleLine(TextBox textBox)
{
return SendMessage(textBox.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
}
至于VisibleLines,我认为你必须继续计算bottomLine
。