Visual Studio MFC 在键入/动态时更改编辑控件中的文本

Posted

技术标签:

【中文标题】Visual Studio MFC 在键入/动态时更改编辑控件中的文本【英文标题】:Visual Studio MFC change text in Edit Control while typing/dynamically 【发布时间】:2020-12-03 18:45:23 【问题描述】:

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

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

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

ID= rdbOff, m_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)    

更新: got EN_CHANGE to work 我能够让EN_CHANGE 使用来自用户@GoGoWorx 的标志建议。但是,现在我只是有一个小问题,光标回到了编辑控件的开头txtInput。 我正在阅读有关使用 CEdit::SetSel 的信息,但不知道如何在我的代码中直接使用它。我试过 CEdit control MFC, placing cursor to end of string after 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);

【问题讨论】:

【参考方案1】:

听起来您需要使用ON_EN_CHANGE message-map 通知(例如在由于键入或粘贴而更新控件后调用)

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 消息是在控件更新之后发送的,而@987654332 @ 仅在更新之前被调用。

消息映射处理程序在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

【讨论】:

您好@GoGoWorx,感谢您的指导。我开始研究 EN_CHANGE,而且你说得对,我的编辑控件是 txtInputBox。我现在意识到一些问题,因为我正在努力解决问题,并更新了原始帖子。 您在 SetSet() 的正确轨道上,但由于您并没有真正尝试选择任何内容,只需将光标(插入符号)移动到某个位置。这是通过选择选择长度为 0 的位置来控制的,因此在您的情况下,您可能希望获取新文本的长度以设置选择位置的“开始”,然后选择的结束将是相同(因此选择了 0 个字符) res_len = strlen(result); txtInputBox.SetSel(res_len, res_len);

以上是关于Visual Studio MFC 在键入/动态时更改编辑控件中的文本的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 建立了一个动态链接库,运行时提示无法启动dll

如何在 Visual Studio 2008 中键入“:”时禁用自动缩进

在编辑器中键入时 Visual Studio 崩溃

如何在 Visual Studio 中更快地键入“0”?

Visual Studio 2008 未加载 MFC dll 符号

无法在Visual Studio 2010 + Resharper中键入某些方括号