Диалог по управлению светом
Работа с группой регуляторов
В диалоговый класс введите обработчики сообщений WM_HSCROLL и WM_CLOSE, a также реакцию на нажатие кнопки IDC_FILENAME. Воспользуйтесь для этого окном Properties и его кнопками Messages и Events. В обработчик OnHScroll введите логику определения ползунка и управления им с помощью мыши и клавиш. Подобный код мы подробно рассматривали в уроке 4. Прочтите объяснения вновь, если это необходимо, вместе с сообщением WM_HSCROLL система прислала нам адрес объекта класса GScrollBar, связанного с активным ползунком.
Мы добываем Windows-описатель его окна (hwnd) и передаем его в функцию GetsliderNum, которая возвращает целочисленный индекс. Последний используется для доступа к массиву позиций ползунков. Кроме этого, система передает nSBCode, который соответствует сообщению об одном из множества событий, которые могут произойти с ползунком (например, управление клавишей левой стрелки – SB_LINELEFT). В зависимости от события мы выбираем для ползунка новую позицию:
void CPropDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { //====== Windows-описатель окна активного ползунка HWND hwnd = pScrollBar › GetSafeHwnd(); UINT nID; //=== Определяем индекс в массиве позиций ползунков int num = GetSliderNum(hwnd, nID); int delta, newPos; //====== Анализируем код события switch (nSBCode) { case SBJTHUMBTRACK: case SB_THUMBPOSITION: // Управление мышью m_Pos[num] = nPos; break; case SB_LEFT: // Клавиша Home delta = -100; goto New_Pos; case SB_RIGHT: // Клавиша End delta = + 100; goto New__Pos; case SB_LINELEFT: // Клавиша <- delta = -1; goto New_Pos; case SB_LINERIGHT: // Клавиша › delta = +1; goto New_Pos; case SB_PAGELEFT: // Клавиша PgUp delta = -20; goto New_Pos; case SB_PAGERIGHT: // Клавиша PgDn delta = +20-; goto New_Pos; New_Pos: // Общая ветвь //====== Устанавливаем новое значение регулятора newPos = m_Pos[num] + delta; //====== Ограничения m_Pos[num] = newPos<0? 0: newPos >100? 100: newPos; break; case SB ENDSCROLL: default: return; } //====== Синхронизируем текстовый аналог позиции char s [ 8 ]; sprintf (s, "%d",m__Pos [num]); SetDlgltemText (nID, (LPCTSTR)s); //---- Передаем изменение в класс COGView m_pView › SetLightParam (num, m_Pos [num]); }