Учебник по Visual C++ .Net


Диалог по управлению светом В - часть 3


};

Откройте файл реализации диалогового класса и с учетом сказанного про адрес окна введите изменение в тело конструктора, который должен приобрести такой вид:

CPropDlg::CPropDlg(COGView* p)

: CDialog(CPropDlg::IDD, p)

{

//====== Запоминаем адрес объекта

m_pView = p;

}

Инициализация диалога

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




Начало  Назад  Вперед