从Caret获取行号

时间:2012-12-30 22:17:53

标签: c++ windows-8 textbox microsoft-metro windows-runtime

我正在尝试从文本框中的插入位置获取行号,这是我的内容:

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;
}

1 个答案:

答案 0 :(得分: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;
}