Ввод новых команд
Вы заметили, что до сих пор обходились без каких-либо ресурсов. Мы не учитываем традиционный диалог About, планку меню главного окна, панель инструментов, две таблицы (строк и ускорителей) и два значка, которые присутствовали в каркасе приложения изначально. Дальнейшее развитие потребует ввести новые ресурсы. Главным из них будет диалог, который мы запустим в немодальном режиме и который позволит подробно исследовать влияние параметров освещения на качество изображения. Начинать, как обычно, следует с команд меню. Скорректируйте меню главного окна так, чтобы в нем появились новые команды:
- Edit › Properties (ID_EDIT_PROPERTIES);
- Edit › Background (ID_EDIT_BACKGROUND);
- View › Fill (ID_VIEW_FILL);
- View › Quad (ID_VIEW_QUAD).
Одновременно удалите не используемые нами команды: File › New, File › Open, File › Save, File › Save as, File › Recent File, Edit › Undo, Edit › Cut, Edit › Copy и Edit › Paste.
Примечание
Вы, конечно, знаете, что идентификаторы команд можно не задавать. Они генерируются автоматически при перемещении фокуса от вновь созданной команды к любой другой.
После этого в классе cocview создайте обработчики всех новых команд с именами по умолчанию (их предлагает Studio .NET). При создании реакций на эти команды меню (COGView › Properties › Events) предварительно раскройте все необходимые элементы в дереве Properties › Commands. Одновременно с функциями обработки типа COMMAND создайте (для всех команд, кроме Edit › Background) функции обновления пользовательского интерфейса, то есть функции обработки типа UPDATE_ COMMANDJJI. Они, как вы помните, следят за состоянием команд меню и соответствующих им кнопок панели управления, обновляя интерфейс пользователя. Команды становятся доступными или, наоборот, в зависимости признака, управляемого программистом.
В обработчике OnEditBackground мы вызовем стандартный диалог по выбору цвета, сразу открыв обе его страницы (см. флаг CC_FULLOPEN). С помощью этого диалога пользователь сможет изменить цвет фона:
void 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); }