Visual Studio MFC altera o texto no controle de edição ao digitar / dinamicamente

Dec 04 2020

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_isOnvalor seria =0

e 1 controle de edição, ID = txtInputBox, com CStringvariá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 SetDlgItemTextdo 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_CHANGEtrabalhar 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::SetSelmas 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

3 GoGoWorx Dec 04 2020 at 08:04

Parece que você precisa usar a ON_EN_CHANGEnotificaçã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_CONTROLacima por seu define (possivelmente txtInputBox, mas novamente, normalmente são maiúsculas , então não tenho certeza )

Altere também CMyDialogo 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_CHANGEmensagem é 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 CEditdocumentaçã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_CHANGEnovamente 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 CEditcontrole 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