这些工作,但我担心有更好的方法。

时间:2012-08-20 19:19:02

标签: c# winforms

我正在编写文本编辑器,我想知道是否有更快/更可靠的方法来执行这些功能。我在这里写的是最好的,我认为我能做到并且可以做到,除了我有一种感觉,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();
        }
    }

1 个答案:

答案 0 :(得分:2)

您可以通过向文本框发送消息来获取第一条可见行,以获取第一行,而不是使用GetCharIndexFromPositionGetLineFromCharIndex一次。我不确定为什么TextBox(或TextBoxBase)类没有实现它。

private const int EM_GETFIRSTVISIBLELINE = 206;
private int GetFirstVisibleLine(TextBox textBox) 
{
    return SendMessage(textBox.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
}

至于VisibleLines,我认为你必须继续计算bottomLine