Почему CSpinButtonCtrl неправильно обрабатывает числа выше 1000? - PullRequest
0 голосов
/ 07 мая 2018

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

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

1 Ответ

0 голосов
/ 07 мая 2018

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

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

...