Visual Studio MFC изменить текст в элементе управления Edit при вводе / динамически

Dec 04 2020

Я пытаюсь настроить приложение MFC C ++ в Visual Studio 2019, которое изменяет текст пользователя при вводе.

Текущая раскладка - это 2 переключателя,

ID = rdbOn(установлен в Group = True, с переменной Value int m_isOn= 1)

ID = rdbOff, m_isOnзначение будет =0

и 1 элемент управления Edit, ID = txtInputBox, с CStringпеременной Valuem_inputString

В настоящее время для тестирования я могу увидеть, как это будет работать при нажатии кнопки, потребуется что-то вроде следующего и просто SetDlgItemTextрезультат. Но это будет после того, как они напечатают, а не ПОКА они печатают.

void Onsomebtnclick()
{
    //convert CString to String of m_inputString
    //do some string manipulation
    //convert back to CString
    //SetDlgItemText(txtInputBox, result)    
}

Обновление: приступил EN_CHANGEк работе. Я смог EN_CHANGEработать с предложением флага от пользователя @GoGoWorx. Однако теперь у меня просто небольшая проблема с тем, что курсор вернулся в начало элемента управления редактированием txtInput.
Я читаю об использовании, CEdit::SetSelно не знаю, как использовать это непосредственно в моем коде. Я попробовал CEdit control MFC, поместив курсор в конец строки после SetWindowText

someDlg::someFunction()
{
    //some logic stuff to get a result string
    SetDlgItemText(txtInputBox, result);
    //need it to set the cursor to the end
    //I tried these, but it didn't recognize (expression must have class type?)
    //txtInputBox.SetSel(0, -1);
    //txtInputBox.SetSel(-1);
}

Ответы

3 GoGoWorx Dec 04 2020 at 08:04

Похоже, вам нужно использовать ON_EN_CHANGEуведомление о карте сообщений (вызываемое после обновления элемента управления из-за ввода или вставки, например)

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)   
    ON_EN_CHANGE(IDC_EDIT_CONTROL, &CMyDialog::OnEnChangeEditControl)
END_MESSAGE_MAP()

void CMyDialog::OnEnChangeEditControl()
{
   // Copy or call your Onsomebtnclick() here
}

Я не уверен, что вы используете для числового идентификатора для элемента управления редактированием, поскольку обычно это определения верхнего регистра - замените IDC_EDIT_CONTROLвыше своим определением (возможно txtInputBox, но опять же, это обычно верхний регистр , поэтому я не уверен ).

Также измените CMyDialogимя вашего диалогового класса.

Обратите внимание, что мы используем ON_EN_CHANGEздесь обработчик карты сообщений вместо ON_EN_UPDATE, поскольку ON_EN_CHANGEсообщение отправляется после обновления элемента управления, а ON_EN_UPDATEвызывается непосредственно перед его обновлением.

Обработчики карты сообщений описаны в разделе « Примечания » CEditдокументации управления:https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160

Что касается вашего беспокойства по поводу изменения вещей по мере того, как пользователь вводит - это должно быть нормально, поскольку каждое изменение (нажатие клавиши или вставка из буфера обмена и т. Д.) Должно вызывать вызов этого обработчика, в котором вы можете изменить все, что вам нужно. Просто убедитесь, что при обновлении элемента управления вы не запускаете его ON_EN_CHANGEснова и не попадаете в рекурсивный цикл «изменения».

Возможно, вы сможете сделать это с помощью какого-то флага, чтобы указать, что вы обновляете элемент управления, а не пользователь, однако, вероятно, лучше создать подкласс элемента CEditуправления, чтобы делать то, что вы хотите. Есть несколько примеров того, как это сделать (это не так сложно, как может показаться), например:https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications