Иллюстрированный самоучитель по Visual Studio .NET

Диалог по управлению светом

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

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