Читаем MFC и OpenGL полностью

  0, 0, 0, 0, 0, 0, // color bits ignored

  0, // no alpha buffer

  0, // shift bit ignored

  0, // no accumulation buffer

  0, 0, 0, 0, // accum bits ignored

  32, // 32-bit z-buffer

  0, // no stencil buffer

  0, // no auxiliary buffer

  PFD_MAIN_PLANE, // main layer

  0, // reserved

  0, 0, 0 // layer masks ignored

 };

 int pixelformat;

 if ((pixelformat = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd)) == 0) {

  MessageBox("ChoosePixelFormat failed");

  return FALSE;

 }

 if (SetPixelFormat(pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) {

  MessageBox("SetPixelFormat failed");

  return FALSE;

 }

 return TRUE;

}

Как не трудно заметить, она почти полностью взята из Win32API приложения за исключением того, что hDC заменена на pDC->GetSafeHdc().

Теперь добавим в нашу программку обработчик от таймера (мы его недавно сделали в ф-ции Init())

void CBitScrollDlg::OnTimer(UINT nIDEvent) {

 DrawScene();

 CDialog::OnTimer(nIDEvent);

}

Все тривиально. По смыслу ясно, что каждый раз, когда срабатывает обработчик таймера (а делает он это часто) рисуется сцена. Таким образом получается анимация. Посмотрим на эту функцию:

void CBitScrollDlg::DrawScene() {

 static GLfloat angle = 0;

 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glLoadIdentity();

 glTranslatef(0.0f, 0.0f, –2.0f);

 glRotatef(angle, 1.0f, 0.5f, 0.3f);

 glBegin(GL_QUADS);

 glColor3f(1.0f, 0.0f, 1.0f);

 glVertex3f(-0.5f, 0.5f, 0.0f);

 glColor3f(1.0f, 1.0f, 1.0f);

 glVertex3f(0.5f, 0.5f, 0.0f);

 glColor3f(0.0f, 1.0f, 1.0f);

 glVertex3f(0.5f, –0.5f, 0.0f);

 glColor3f(0.0f, 0.0f, 1.0f);

 glVertex3f(-0.5f, –0.5f, 0.0f);

 glEnd();

 glFinish();

 SwapBuffers(wglGetCurrentDC());

 angle += 0.5f;

}

По моему проще уже некуда. Я надеюсь, что все ясно.

Ну вот казалось бы и все. Единственное, что остается сделать – убраться за собой. Т.е. надо при выходе удалить контекст рендеринга и убить таймер.

Эти вещи надо сделать в 2-х обработчиках OnClose и OnDestroy. Посмотрим на них:

void CBitScrollDlg::OnClose() {

 // TODO: Add your message handler code here and/or call default

 HGLRC hrc;

 KillTimer(1);

 hrc = ::wglGetCurrentContext();

 ::wglMakeCurrent(NULL, NULL);

 if (hrc) ::wglDeleteContext(hrc);

 CDialog::OnClose();

}

и

void CBitScrollDlg::OnDestroy() {

 CDialog::OnDestroy();

 // TODO: Add your message handler code here

 HGLRC hrc;

 KillTimer(1);

 hrc = ::wglGetCurrentContext();

 ::wglMakeCurrent(NULL, NULL);

 if (hrc) ::wglDeleteContext(hrc);

}

Она практически одинаковые. Работают так же как и case WM_CLOSE в Win32API. Т.е. убиваем таймер, получаем контекст рендеринга, если он есть – удаляем его.

Ну вот и все. Еще добавлю, что в проекте есть функция OnSize для обработки изменений размеров окна. В данном случае она не нужна, но если вставлять OpenGL в SDI или MDI, то она вам понадобится.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных