文本长度更改后 EditBox 中的插入符位置

Caret position in EditBox after change in text length

我在 MFC 对话框中有一个 EditBox。用户应该输入一个数字。我正在尝试在用户输入数字时自动将分隔符添加到数字中:

当号码超过3位时,百位和千位之间加分隔符;当它超过 6 位时,第二个介于十万和百万之间,依此类推(例如,1234567 变为 1,234,567)。

这是在 ON_EN_CHANGE 执行的函数中完成的,基本上已经可以正常工作了。但问题是,一旦我的函数更改了其中字符串的长度,插入符号位置就会设置到 EditBox 的开头,从而防止连续输入。

我尝试模拟按下结束键将插入符号发送到 EditBox 的末尾,只要用户只从左到右输入数字,它就可以工作。但当用户试图添加、删除或编辑数字中间的数字时,它将不起作用。我需要插入符号位置在用户按下键之前数字的确切位置。

我尝试根据前一个插入符位置(使用 CEdit::GetSel() 获得)和数字的前一个长度计算新插入符位置:

OnEnChange()
{
    int prevCursPos {HIWORD(m_editCtrl.GetSel())};
    int prevStrLen {m_editCtrl.GetWindowTextLengthW()};
    UpdateData(TRUE);
    // Adding/Removing of separators as needed
    UpdateData(FALSE);
    int difference {m_editCtrl.GetWindowTextLengthW() - prevStrLen))};
    if(difference > 0) // a separator has been added to the string
        m_editCtrl.SetSel(-1, prevCursPos + 1);
}

但是,SetSel() 函数似乎没有任何作用。我也尝试发送一条 EM_SETSEL 消息,但我也不知道该怎么做,插入符号总是将自身重置为 EditBox 的开头。

有没有人对如何完成我想做的事情有其他想法?

  1. 不清楚您如何根据需要处理 "/ Adding/Removing 个分隔符"
  2. 如果字符串在调用 UpdateData(false) 后发生变化,则将第一个参数设置为 -1 的 SetSel 会将插入符定位在字符串的开头

为此编辑控件创建 CString 类型的变量(例如m_csEdit)并

    int iLen = m_csDDx.GetLength();
    m_editCtrl.SetSel(iLen, -1);

    m_editCtrl.SetSel(iLen, iLen);

您可以计算与我建议的不同的长度。 考虑使用屏蔽编辑控件(可能)。

忘记说了。使用 GetNumberFormatEx 格式化带有千位分隔符的数字。