2

我正在尝试在 Visual Studio 2019 中设置 MFC C++ 应用程序,以便在用户键入时修改用户的文本。

当前布局是 2 个单选按钮,

ID= rdbOn(设置为 Group = True,Value int 变量m_isOn= 1

ID= rdbOffm_isOn值将是 =0

布局

和 1 编辑控件 ID= txtInputBox,带有值CString变量m_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
我正在阅读有关使用 aCEdit::SetSel但不知道如何在我的代码中直接使用它的信息。我尝试 了 CEdit 控件 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);
}
4

1 回答 1

3

听起来您需要使用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被调用。

消息映射处理程序在控制文档的备注部分中进行了描述: https ://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160CEdit

关于您在用户键入时修改内容的担忧 - 这应该没问题,因为每次更改(击键或从剪贴板粘贴等)都应该触发此处理程序被调用,您可以在其中更改您需要的任何内容。请确保当您更新控件时,您不会ON_EN_CHANGE再次触发并最终进入递归“更改”循环。

您可能可以使用某种标志来执行此操作,以指示您是更新控件的人,而不是用户,但是最好将CEdit控件子类化以执行您想要的操作。有一些如何做到这一点的例子(它并不像听起来那么难),例如: https ://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications

于 2020-12-04T01:04:05.173 回答