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


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


m_pDlg = new CPropDlg(this);

m_pDlg->Create(IDD_PROP);

}

else

// Иначе, переводим фокус в окно диалога

m_pDlg->SetActiveWindow();

}

Реакция на команду обновления пользовательского интерфейса при этом может быть такой:

void COGView::OnUpdateEditProperties(CCmdUI *pCmdUI)

{

pCmdUI->SetCheck (m_pDlg != 0);

}

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

void COGView::OnEditProperties (void)

{

m_pDlg = new CPropDlg(this);

m_pDlg->Create(IDD_PROP); }

Но при этом необходима другая реакция на команду обновления интерфейса:

void COGView::OnUpdateEditProperties(CCmdUI *pCmdUI)

{

pCmdUI->Enable(m_pDlg == 0);

}

Выберите и реализуйте один из вариантов.

Панель управления

Завершая разработку приложения, вставьте в панель управления четыре кнопки

Для команд ID_EDIT_BACKGROUND, ID_EDIT_PROPERTIES, ID_VIEW_FILL И ID_VIEW_

QUAD. Заодно уберите из нее неиспользуемые нами кнопки с идентификаторами

ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVE, ID_FILE_PRINT, ID__EDIT_CUT,

ID_EDIT_COPY, ID_EDIT_PASTE. Запустите приложение, включите диалог Edit > Properties и попробуйте управлять регуляторами параметров света. Отметьте, что далеко не все из них отчетливым образом изменяют облик поверхности. Нажмите кнопку Data File, при этом должен открыться файловый диалог, но мы не сможем открыть никакого другого файла, кроме того, что был создан по умолчанию. Он имеет имя «Sin.dat» и должен находиться (и быть виден) в папке проекта. В качестве упражнения создайте какой-либо другой файл с данными, отражающими какую-либо поверхность в трехмерном пространстве. Вы можете воспользоваться для этой цели функцией DefaultGraphic, немного модифицировав ее код. На рис. 7.5 и 7.6 приведены поверхности, полученные таким способом. Вы можете видеть эффект, вносимый различными настройками параметров освещения.

Если вы тщательно протестируете поведение приложения, то обнаружите недостатки. Отметим один из них. Закрытые части изображения при некотором ракурсе просвечивают сквозь те части поверхности, которые находятся ближе к наблюдателю. Причину этого дефекта было достаточно трудно выявить. И здесь опять пришли на помощь молодые, талантливые слушатели Microsoft Authorized Educational Center (www.Avalon.ru) Кондрашов С. С. (scondor@rambler.ru) и Фролов Д. С. (dmfrolov@rambler.ru). Оказалось, что при задании типа проекции с помощью команды gluPerspective значения ближней границы фрустума не должны быть слишком маленькими:




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