为什么 CSpinButtonCtrl 不能正确处理大于 1000 的数字?

Why CSpinButtonCtrl is not handling correctly numbers higher than 1000?

本文关键字:数字 1000 大于 CSpinButtonCtrl 不能 正确处理 为什么      更新时间:2023-10-16

我在MFC中有一个对话框,上面有一个CSpinButtonCtrl和一个附加的伙伴(CEdit)。当旋转控制的最大值低于 1000 时,它们可以正常工作,但如果它更高,则当值为 1000 或更高时,CEdit中的值被钳制为千个单位(例如,它被钳制为 4 而不是 4345)。

BEGIN
EDITTEXT IDC_EDIT_1,274,42,40,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL  "",IDC_SPIN_1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,313,42,11,14
END

范围以编程方式设置:

const int max_value = 5000;
auto spin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_1);
spin->SetRange(1, max_value);

知道发生了什么吗?

由于我找不到任何与之相关的问题,因此我发布了我的查询:

问题源于这样一个事实,即当CSpinButtonCtrl设置好友的文本时,它会将其数值转换为默认情况下包含千位分隔符的字符串。可以注意到,CEdit控件设置为仅接受数字。由于千位分隔符不是数字,因此CEdit将文本夹在上面,只留下分隔符左侧的文本(在我的例子中为千单位)。

要解决它,只需将UDS_NOTHOUSANDS样式添加到旋转控件:

CONTROL "",IDC_SPIN_1,"msctls_updown32",UDS_NOTHOUSANDS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,313,42,11,14

当然,另一种选择是从编辑控件中删除ES_NUMBER,但这不是我的 UI 需要。