MFC и OpenGL | страница 2



> glMatrixMode(GL_MODELVIEW);

>}

Что мы тут делаем? Прежде всего вызываем ф-ию SetupPixelFormat(), это опять наша функция и мы посмотрим ее чуть позже.

Далее, как и раньше, получаем контекст рендеринга (маленькая деталь, ранее pDC(а точнее эта переменная называлась hDC) была объявлена как static HDC hDC, сейчас контекст рисования является пременной типа CDC, а ф-ция wglCreateContext и другие функции OpenGL требуют в качестве аргумента переменную типа HDC. Поэтому мы получаем этот hardware context с помощью pDC->GetSafeHdc()).

Затем делаем этот контекст текущим и настраиваем область отображения, так как это делалось в Initial() (Win32API)

Функция bSetupPixelFormat() содержит следующее:

>BOOL CBitScrollDlg::bSetupPixelFormat() {

> static PIXELFORMATDESCRIPTOR pfd = {

>  sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

>  1, // version number

>  PFD_DRAW_TO_WINDOW | // support window

>  PFD_SUPPORT_OPENGL | // support OpenGL

>  PFD_DOUBLEBUFFER, // double buffered

>  PFD_TYPE_RGBA, // RGBA type

>  24, // 24-bit color depth

>  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);