Элемент управления Visual C ++ CEdit - почему точка вставки изменяется с помощью SetWindowText () - PullRequest
1 голос
/ 13 марта 2011

Следующий фрагмент взят из обработчика OnChange () многострочного элемента управления CEdit, для которого установлено значение WantReturn.

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    std::vector<char> aTape;
    m_prepareTape.GetWindowText(ss);
    m_prepareTape.SetWindowText(ss);
}

Если SetWindowText () закомментирован, текст пользователя создается направильно, и все хорошо.Но с этим, точка вставки текста перемещается к левому краю, а символы пользователя переходят влево от существующих символов.

Я хочу поместить какой-нибудь переворачивающий текст между двумя вызовамиможно получить то, что я хочу, создав подкласс CEdit.Но мне было бы интересно узнать, есть ли способ сделать это с помощью Get () и Set ().

Я использую Visual C ++ 6, с пакетом обновления 5. Уже одиннадцать лет, нотогда «Программное обеспечение не изнашивается», как говорится: -).

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Точка вставки сбрасывается на SetWindowText(), потому что, с точки зрения элемента управления, все его текстовое содержимое было только что сброшено (возможно, в пустую строку), и и точка вставки, и текущий выбор могут быть не значимымидостаточно, чтобы держать их рядом.

Вы можете использовать GetSel () и SetSel () , чтобы реализовать это поведение самостоятельно:

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    std::vector<char> aTape;

    int start, end;
    m_prepareTape.GetSel(start, end);
    m_prepareTape.GetWindowText(ss);

    // Tinker with the text...

    m_prepareTape.SetWindowText(ss);
    m_prepareTape.SetSel(start, end);
}
1 голос
/ 13 марта 2011

Вы можете использовать GetSel для получения позиции курсора перед заменой текста и SetSel для последующего размещения его в том же месте.

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    int start, stop;
    std::vector<char> aTape;
    m_prepareTape.GetWindowText(ss);
    m_prepareTape.GetSel(&start, &stop);
    m_prepareTape.SetWindowText(ss);
    m_prepareTape.SetSel(start, stop);
}

Если вы изменили текст передположить его обратно в текстовое поле, вы можете увеличить или уменьшить startend) соответственно.

...