Диалог по управлению светом
Инициализация диалога
При каждом открытии диалога все его элементы управления должны отражать текущие состояния регулировок (положения движков), которые хранятся в классе представления. Обычно эти установки производят в коде функции OninitDialog. Введите в класс CPropDlg стартовую заготовку этой функции (CPropDlg › Properties › Overrides › OninitDialog › Add) и наполните ее кодами, как показано ниже:
BOOL CPropDlg: rOnlnitDialog (void) { CDialog::OnInitDialog (); //====== Заполняем массив текущих параметров света m_pView › GetLightParams (m _Pos); //====== Массив идентификаторов ползунков UINT IDs[ ] = { IDC_XPOS, IDC_YPOS, IDC_ZPOS, IDC_AMBIENT, IDC_DIFFUSE, IDC_SPECULAR, IDC_AMBMAT, IDC_DIFFMAT, IDC_SPECMAT, IDC_SHINE, IDCEMISSION //====== Цикл прохода по всем регуляторам for (int i=0; Ksizeof (IDs) / sizeof (IDs [ 0]); i++) { //=== Добываем Windows-описатель окна ползунка H WND hwnd = GetDlgItem(IDs[i] } › GetSafeHwnd (); UINT nID; //====== Определяем его идентификатор int num = GetSliderNum(hwnd, nID); // Требуем установить ползунок в положение m_Pos[i] ::SendMessage(hwnd, TBM_SETPOS, TRUE, (LPARAM) m_Pos [i]) char s [ 8 ]; //====== Готовим текстовый аналог текущей позиции sprintf (s, "%d",m_Pos [ i]); //====== Помещаем текст в окно справа от ползунка SetDlgltemText (nID, (LPCTSTR) s); } return TRUE; }
Вспомогательная функция GetsliderNum по переданному ей описателю окна (hwnd ползунка) определяет идентификатор связанного с ним информационного окна (типа Static text) и возвращает индекс соответствующей ползунку пози ции в массиве регуляторов:
int CPropDlg::GetSliderNum (HWND hwnd, UINT& nID) { //==== GetDlgCTRLlD по известному hwnd определяет //==== и возвращает идентификатор элемента управления switch (:: GetDlgCTRLlD (hwnd)) { // ====== Выясняем идентификатор окна справа case IDC_XPOS: nID = IDC_XPOS_TEXT; return 0; case IDC_YPOS: nID = IDC_YPOS_TEXT; return 1; case IDC_ZPOS: nID = IDC_ZPOS_TEXT; return 2; case IDC_AMBIENT: nID = IDC_AMB_TEXT; return 3; case IDC_DIFFUSE: nID = IDC_DIFFUSE_TEXT; return 4; case IDC_SPECULAR: nID = IDC_SPECULAR_TEXT; return 5; case IDC_AMBMAT: nID = IDC_AMBMAT_TEXT; return 6; case IDC_DIFFMAT: nID = IDC_DIFFMAT_TEXT; return 7; case IDC_SPECMAT: nID = IDC_SPECMAT_TEXT; return 8; case IDC_SHINE: nID = IDC_SHINE_TEXT; return 9; case IDC_EMISSION: nID = IDC_EMISSION_TEXT; return 10; } return 0; }