Visual Studio MFC изменить текст в элементе управления Edit при вводе / динамически
Я пытаюсь настроить приложение 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);
}
Ответы
Похоже, вам нужно использовать 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