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



Ввод новых команд Вы заметили


COGView::OnEditBackground(void)

{

//====== Создаем объект диалогового класса

CColorDialog dig(m_BkClr); //====== Устанавливаем бит стиля

dig.m_cc.Flags |= CC_FULLOPEN;

//====== Запускаем диалог и выбираем результат

if (cilg.DoModal ()==IDOK)

{

m_BkClr = dig.m_cc.rgbResuit;

//====== Изменяем цвет фона

SetBkColor();

Invalidate(FALSE);

}

}

Проверьте результат, запустив приложение и вызвав диалог. При желании создайте глобальный массив с 16 любимыми цветами и присвойте его адрес переменной lpCustColors, которая входит в состав полей структуры m_сс, являющейся членом класса CColorDialog. В этом случае пользователь сможет подобрать и запомнить некоторые цвета.

В обработчик OnViewQuad введите коды, инвертирующие булевский признак m_bQuad, который мы используем как флаг необходимости рисования отдельными четырехугольниками (GL_QUADS), и заново создают изображение. Если признак инвертирован, то мы рисуем полосами (GL_QUAD_STRIP):

void COGView::OnViewQuad(void)

{

// Инвертируем признак стиля задания четырехугольников

m_bQuad = ! m_bQuad;

//====== Заново создаем изображение

DrawScene (); Invalidate(FALSE); UpdateWindow();

}

В обработчик команды обновления интерфейса введите коды, которые обеспечивают появление маркера выбора рядом с командой меню (или залипания кнопки панели управления):

void COGView::OnUpdateViewQuad(CCmdUI* pCmdUI)

{

//====== Вставляем или убираем маркер (пометку)

pCmdUI->SetCheck(m_bQuad==true);

}

Проверьте результат и попробуйте объяснить зубчатые края поверхности (рис. 7.2). Не знаю, правильно ли я поступаю, когда по ходу изложения вставляю задачи подобного рода. Но мной движет желание немного приоткрыть дверь в кухню разработчика и показать, что все не так уж просто. Искать ошибки в алгоритме, особенно чужом, является очень кропотливым занятием. Однако совершенно необходимо приобрести этот навык, так как без него невозможна работа в команде, а также восприятие новых технологий, раскрываемых в основном посредством анализа содержательных (чужих) примеров (Samples). Чтобы обнаружить ошибку подобного рода, надо тщательно проанализировать код, в котором создается изображение (ветвь GL_QUAD_STRIP), и понять, что неправильно выбран индекс вершины. Замените строку givertex3f (xn, yn, zn); HaglVertexSf (xi, yi, zi); и вновь проверьте работу приложения. Зубчатость края должна исчезнуть, но в алгоритме, тем не менее, осталась еще небольшая, слабо заметная неточность. Ее обнаружение и исправление я оставляю вам, дорогой читатель.




Содержание  Назад  Вперед