Как я могу динамически создать Spin Button Control в MFC, используя класс CSpinButtonCtrl?

Я понимаю, что это тривиальная проблема, и я даже посмотрел книгу MFC (Программирование Windows с помощью MFC от Prosise). Тем не менее, я не мог найти решение.

Я пытаюсь создать элемент управления Spin Button динамически, и вот упрощенный код:

    CEdit* m_editControl = new CEdit();
m_EditControl->Create(WS_VISIBLE | WS_CHILD , rectEdit, this, EditID);

CSpinButtonCtrl* m_spinControlCtrl = new CSpinButtonCtrl;
m_spinControlCtrl->Create(WS_VISIBLE | WS_CHILD, rectSpinButton, this, SpinID);

m_spinControlCtrl->SetBase(10);
m_spinControlCtrl->SetBuddy(m_editControl );
m_spinControlCtrl->SetRange(-55, 55);

Моя проблема в том, что кнопка прокрутки не меняет значение CEdit. Я что-то пропустил? Как я могу динамически создать Spin Button Control?

2

Решение

В вашем управлении вращением отсутствует стиль UDS_SETBUDDYINT:

UDS_SETBUDDYINT Вызывает управление вверх-вниз, чтобы установить текст
Окно приятеля (используя сообщение WM_SETTEXT), когда позиция меняется.
Текст состоит из позиции, отформатированной как десятичная или
шестнадцатеричная строка.

Я также предлагаю установку UDS_ARROWKEYS поэтому клавиши со стрелками могут использоваться для увеличения или уменьшения значения, когда фокус находится на элементе управления редактирования.

Для контроля редактирования я бы добавил WS_TABSTOP так что пользователь может перемещаться с помощью TAB ключ и WS_EX_CLIENTEDGE поэтому элемент управления редактированием показывает обычную тематическую границу.

Я также заметил, что вы используете динамическое выделение памяти для элементов управления, что не является необходимым. Просто создайте не указательные переменные-члены, такие как CEdit m_EditControl; так что вам не нужно беспокоиться об освобождении.

Фиксированный код:

m_EditControl.CreateEx(WS_EX_CLIENTEDGE, L"Edit", L"0", WS_VISIBLE|WS_CHILD|WS_TABSTOP,
rectEdit, this, EditID);

m_spinControlCtrl.Create(WS_VISIBLE|WS_CHILD|UDS_SETBUDDYINT|UDS_ARROWKEYS,
rectSpinButton, this, SpinID);

m_spinControlCtrl.SetBase(10);
m_spinControlCtrl.SetBuddy(&m_EditControl);
m_spinControlCtrl.SetRange(-55, 55);

Я также настоятельно рекомендую научиться использовать Spy ++. Вот как я на самом деле пришел к этому ответу. Используя редактор ресурсов, я просто перетащил элемент управления редактирования и вверх-вниз в диалоговое окно и использовал Spy ++ для наблюдения стилей окон по умолчанию.

3

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

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

По вопросам рекламы [email protected]