Посмотрим как нарисовать азбуку морзе. Для этого создадим обычный проект и сделаем необходимые дополнения для 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). Первая из них включает пунктирный режим, а вторая задает вид пунктира. Естественно пунктир задается в виде битовой маски. Вот и все.
Как и большинство команд OpenGL, команда включения пунктира имеет и команду выключения, т.е. glDisable(GL_LINE_STIPPLE). А установленный вид пунктира действует на все линии, которые лежат ниже команды установки. Чтобы отключить пунктир надо либо сделать прозрачную маску, либо отключить режим вообще.