Visual Studio MFC altera o texto no controle de edição ao digitar / dinamicamente
Estou tentando configurar um aplicativo MFC C ++ no Visual Studio 2019, que modifica o texto do usuário à medida que ele digita.
O layout atual é de 2 botões de opção,
ID = rdbOn
(definido como Grupo = True
, com Valor int variável m_isOn
= 1
)
ID = rdbOff
, o m_isOn
valor seria =0

e 1 controle de edição, ID = txtInputBox
, com CString
variável de valorm_inputString
Atualmente, para teste eu posso ver como funcionaria para um botão ao clicar, seria necessário algo como o seguinte e apenas SetDlgItemText
do resultado. Mas isso seria depois de eles terem digitado, não ENQUANTO eles estão digitando.
void Onsomebtnclick()
{
//convert CString to String of m_inputString
//do some string manipulation
//convert back to CString
//SetDlgItemText(txtInputBox, result)
}
Atualização: comecei EN_CHANGEa trabalhar Consegui EN_CHANGE
trabalhar com a sugestão de flag do usuário @GoGoWorx. No entanto, agora tenho apenas um pequeno problema de que o cursor está de volta ao início do controle de edição txtInput
.
Estou lendo sobre como usar um, CEdit::SetSel
mas não sei como usá-lo diretamente no meu código. Tentei CEdit control MFC, colocando o cursor no final da string após 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);
}
Respostas
Parece que você precisa usar a ON_EN_CHANGE
notificação do mapa de mensagem (chamada depois que o controle foi atualizado devido à digitação ou colagem, por exemplo)
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
}
Não tenho certeza do que você está usando para o identificador numérico para o controle de edição, uma vez que esses são tipicamente definições em maiúsculas - substitua IDC_EDIT_CONTROL
acima por seu define (possivelmente txtInputBox
, mas novamente, normalmente são maiúsculas , então não tenho certeza )
Altere também CMyDialog
o nome da sua classe de diálogo.
Observe que estamos usando o ON_EN_CHANGEmanipulador de mapa de mensagem aqui em vez de ON_EN_UPDATE
, uma vez que a ON_EN_CHANGE
mensagem é enviada depois que o controle foi atualizado, enquanto ON_EN_UPDATE
é chamada pouco antes de ser atualizada.
Os manipuladores de mapa de mensagem são descritos na seção Comentários da CEdit
documentação de controle:https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160
Com relação à sua preocupação em modificar as coisas conforme o usuário digita - isso deve ser bom, uma vez que cada alteração (pressionamento de tecla ou colar da área de transferência, etc.) deve acionar este manipulador a ser chamado, onde você pode alterar o que precisar. Apenas certifique-se de que, ao atualizar o controle, você não acione o ON_EN_CHANGE
novamente e acabe em um loop de 'mudança' recursivo.
Você pode ser capaz de fazer isso com algum tipo de sinalizador para indicar que é você quem está atualizando o controle, ao contrário do usuário; no entanto, provavelmente é melhor criar uma subclasse do CEdit
controle para fazer o que deseja. Existem alguns exemplos de como fazer isso (não é tão difícil quanto pode parecer), por exemplo:https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications