文本长度更改后 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 的开头。
有没有人对如何完成我想做的事情有其他想法?
- 不清楚您如何根据需要处理 "/ Adding/Removing 个分隔符"。
- 如果字符串在调用 UpdateData(false) 后发生变化,则将第一个参数设置为 -1 的 SetSel 会将插入符定位在字符串的开头
为此编辑控件创建 CString 类型的变量(例如m_csEdit)并
int iLen = m_csDDx.GetLength();
m_editCtrl.SetSel(iLen, -1);
或
m_editCtrl.SetSel(iLen, iLen);
您可以计算与我建议的不同的长度。
考虑使用屏蔽编辑控件(可能)。
忘记说了。使用 GetNumberFormatEx 格式化带有千位分隔符的数字。
我在 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 的开头。
有没有人对如何完成我想做的事情有其他想法?
- 不清楚您如何根据需要处理 "/ Adding/Removing 个分隔符"。
- 如果字符串在调用 UpdateData(false) 后发生变化,则将第一个参数设置为 -1 的 SetSel 会将插入符定位在字符串的开头
为此编辑控件创建 CString 类型的变量(例如m_csEdit)并
int iLen = m_csDDx.GetLength();
m_editCtrl.SetSel(iLen, -1);
或
m_editCtrl.SetSel(iLen, iLen);
您可以计算与我建议的不同的长度。 考虑使用屏蔽编辑控件(可能)。
忘记说了。使用 GetNumberFormatEx 格式化带有千位分隔符的数字。