获取RichTextBox_Click事件中的插入符号位置

本文关键字:插入 符号 位置 事件 RichTextBox Click 获取 | 更新日期: 2023-09-27 18:24:01

我正在开发一个包含RichTextBox的文本编辑器。我想要实现的功能之一是在TextBox中随时显示前面提到的RichTextBox插入符号的当前行和列。

以下是我使用的部分代码(其余代码与我的问题无关):

int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = richTextBox.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = richTextBox.GetFirstCharIndexFromLine(lineFromCharIndex);
currentLine = richTextBox.GetLineFromCharIndex(selectionStart) + 1;
currentCol = richTextBox.SelectionStart - charIndexFromLine + 1;

在这一点上,我应该提到,当有人使用RichTextBox时,插入符号可以通过三种方式更改位置:

  • 通过更改RichTextBoxText
  • 使用键盘上的箭头键
  • 单击RichTextBox上的任意位置

我在上面发布的代码在前两种情况下都没有问题。然而,在第三种情况下,它并没有真正起作用。

我尝试使用Click事件,注意到selectionStart变量总是得到值0,这意味着我总是得到相同和错误的结果。此外,在其他事件(如MouseClickMouseUp)上使用相同的代码并不能解决我的问题,因为即使在这些事件的持续时间内,selectionStart也是0。

那么,每次用户单击RichTextBox时,我如何获取当前行和列?

获取RichTextBox_Click事件中的插入符号位置

您想要类似以下内容:

private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
{
        RichTextBox box = (RichTextBox)sender;
        Point mouseLocation = new Point(e.X, e.Y);
        box.SelectionStart = box.GetCharIndexFromPosition(mouseLocation);
        box.SelectionLength = 0;
        int selectionStart = richTextBox.SelectionStart;
        int lineFromCharIndex = box.GetLineFromCharIndex(selectionStart);
        int charIndexFromLine = box.GetFirstCharIndexFromLine(lineFromCharIndex);
        currentLine = box.GetLineFromCharIndex(selectionStart) + 1;
        currentCol = box.SelectionStart - charIndexFromLine + 1;
}

在我看来,您真正想要的是处理TextBoxBase.SelectionChanged事件。然后,任何导致选择更改的操作都将调用您的代码,作为一项额外的好处,在调用事件处理程序时,当前选择将已更新,您将确保获得正确的值。

如果这不能满足你的具体需求,那么我一定不理解这个问题。在这种情况下,请提供一个好的最小完整代码示例,清楚地显示您正在尝试做什么,并准确描述该代码的作用以及与您希望它做的不同之处。