Шаг 18 - Бегаем за Мышью

В этом шаге мы будем обрабатывать движения мыши. Будем выводить жирную точку под курсором мыши. Сделать это в 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(...). Что получилось? Правильно, мерцание точки.

Шпаргалка

  1. создать проект.
  2. включить двойную буфферизацию.
  3. сделать обработчик мыши.
  4. рисовать точку и переключать буффер.

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 22.05.2000