В этом шаге мы будем обрабатывать движения мыши. Будем выводить жирную точку под курсором мыши. Сделать это в MFC очень просто, но для правильного отображения точки понадобится несколько изменений.
Во-первых создадим проект и настроим его как в предыдущих шагах. Затем надо добавить еще один флаг в структуру PIXELFORMATDESCRIPTOR:
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
Это флаг PFD_DOUBLEBUFFER.
Переменную CDC* pDC стоит сделать членом класса C...View, т.е. внести ее в раздел private этого класса.
Создадим еще пару переменных, которые будут хранить координаты мыши. Назовем их m_XMousePos и m_YMousePos. Теперь добавим обработчик движения мыши, т.е. OnMouseMove:
void CExampleView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rectClient; GetClientRect(&rectClient); m_XMousePos = (float)(2*point.x)/(float)(rectClient.right)-1; m_YMousePos = (float)(2*(rectClient.bottom-point.y))/ (float)(rectClient.bottom)-1; CView::OnLButtonDown(nFlags, point); InvalidateRect(NULL, FALSE); CView::OnMouseMove(nFlags, point); }
Все, что мы делаем в этом обработчике - это вычисляем координаты мыши в системе координат OpenGL. В конце мы вызываем функцию InvalidateRect(NULL, FALSE). Делаем мы это для того, чтобы перерисовать окно, т.е просим MFC вызвать функцию OnDraw.
Теперь посмотрим изменения в функции OnDraw:
void CExampleView::OnDraw(CDC* pDC) { CRect clientRect; CExampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here GetClientRect(&clientRect); glViewport(0, 0, clientRect.right, clientRect.bottom); glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glPointSize (30); // размер точек glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов glPointSize(20); glBegin (GL_POINTS); glVertex2f(m_XMousePos, m_YMousePos); glEnd(); glDisable(GL_POINT_SMOOTH); SwapBuffers(pDC->m_hDC); }
В целом здесь почти ничего не изменилось, добавили только функцию SwapBuffers(pDC->m_hDC). Её смысл - переключить буффер отображения. Благодаря ей мы можем добиться плавного отображения точки.
Попробуйте убрать флаг PFD_DOUBLEBUFFER и закоментируйте функцию SwapBuffer(...). Что получилось? Правильно, мерцание точки.