Почему CSpinButtonCtrl неправильно обрабатывает числа выше 1000?

У меня есть диалог в 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);

Есть идеи, что происходит?

3

Решение

Поскольку я не смог найти ни одного связанного с ним вопроса, я публикую свои запросы:

Проблема возникла из-за того, что когда 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 из элемента управления редактирования, но это не было моим пользовательским интерфейсом.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector