0

我正在尝试从文本框中的插入符号位置获取行号,这就是我所拥有的:

int Editor::GetLineFromCaret(const std::wstring &text)
{
    unsigned int lineCount = 1;

    for(unsigned int i = 0; i <= m_editWindow->SelectionStart; ++i)
    {
        if(text[i] == '\n')
        {
            ++lineCount;
        }
    }

    return lineCount;
}

但我遇到了一些奇怪的错误。例如,如果我在文本框中有 10 行文本并使用此功能,它不会给我正确的行号,除非插入符号在该行中大约有 10 个字符,并且某些行没有字符,所以它是不正确的。

这就是我在 Damir Arh 的帮助下解决问题的方法:

int Editor::GetLineFromCaret(const std::wstring &text)
{
    unsigned int lineCount = 1;
    unsigned int selectionStart = m_editWindow->SelectionStart;

    for(unsigned int i = 0; i <= selectionStart; ++i)
    {
        if(text[i] == '\n')
        {
            ++lineCount;
            ++selectionStart;
        }
    }

    return lineCount;
}
4

1 回答 1

2

您的计算不起作用,因为新行占用字符串 ( \r\n) 中的两个字符,但该SelectionStart值仅将新行计为单个字符。因此,在每一行之后,您都会减少 1 个字符,即您需要将一个字符进一步移动到该行中,然后才能检测到正确的行。

要修复计算,您需要考虑\r字符:

int Editor::GetLineFromCaret(const std::wstring &text)
{
    unsigned int lineCount = 1;
    unsigned int selectionStart = m_editWindow->SelectionStart;

    for(unsigned int i = 0; i <= m_editWindow->SelectionStart; ++i)
    {
        if(text[i] == '\n')
        {
            ++lineCount;
        }
        if(text[i] == '\r')
        {
            ++selectionStart;
        }
    }

    return lineCount;
}
于 2012-12-31T07:14:02.097 回答