У меня есть диалог в MFC с CSpinButtonCtrl
и прикрепленный друг (CEdit
). Они работают правильно, когда максимальное значение управления вращением ниже 1000, но если оно выше, значение в CEdit
привязывается к тысяче единиц, когда значение равно 1000 или выше (например, оно ограничено 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
из элемента управления редактирования, но это не было моим пользовательским интерфейсом.
Других решений пока нет …