Шаг 22 - Тире, точка, тире

Посмотрим как нарисовать азбуку морзе. Для этого создадим обычный проект и сделаем необходимые дополнения для OpenGL, как в предыдущих примерах.

Для того, чтобы сконцентрироваться на работе шаблонов создадим функцию, которая будет рисовать линию. Назовем ее скажем DrawLine(...):

void CExampleView::DrawLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
	CRect rect;

	GetClientRect(&rect);
	glBegin(GL_LINES);
		glVertex2f(2*x1/rect.right - 1.0f, y1/rect.bottom - 0.5f);
		glVertex2f(2*x2/rect.right - 1.0f, y2/rect.bottom - 0.5f);
	glEnd();
}

Теперь изменим функцию 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);	// очистка буфера цвета

	glColor3f (1.0, 0.0, 0.5);		// текущий цвет примитивов

	glEnable(GL_LINE_STIPPLE);

	glLineWidth (5);			// === толщина 5

	glLineStipple(1, 0x0101);		// точечный
	DrawLine(50.0, 125.0, 150.0, 125.0);

	glLineStipple(1, 0x00F0);		// штриховой
	DrawLine(150.0, 125.0, 250.0, 125.0);

	glLineStipple(1, 0x1C47);		// штрихпунктир
	DrawLine(250.0, 125.0, 350.0, 125.0);

	glLineWidth (20);			// === толщина 20

	glLineStipple(1, 0x0101);
	DrawLine(50.0, 50.0, 150.0, 50.0);

	glLineStipple(1, 0x00F0);
	DrawLine(150.0, 50.0, 250.0, 50.0);

	glLineStipple(1, 0x1C47);		// тире, точка, тире
	DrawLine(250.0, 50.0, 350.0, 50.0);

	glLineWidth (5);

	glLineStipple(5, 0x1C47);
	DrawLine(50.0, 10.0, 150.0, 10.0);
}

Обратите внимание на пару команд glEnable(GL_LINE_STIPPLE) и glLineStipple(1, 0x0101). Первая из них включает пунктирный режим, а вторая задает вид пунктира. Естественно пунктир задается в виде битовой маски. Вот и все.

Шпаргалка

  1. Создать проект.
  2. Включить пунктирный режим и установить нужный пунктир.
  3. Рисовать.

Как и большинство команд OpenGL, команда включения пунктира имеет и команду выключения, т.е. glDisable(GL_LINE_STIPPLE). А установленный вид пунктира действует на все линии, которые лежат ниже команды установки. Чтобы отключить пунктир надо либо сделать прозрачную маску, либо отключить режим вообще.


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