Листинг 3.7. Типичное использование класса Canvas
Canvas cvs(640. 480. "try out Canvas"):
// global canvas object
// глобальный объект класса canvas
//«««««««< display »»»»»>
void display(void)
{
cvs.clearScreenO: // clear screen // очистка экрана
cvs.setWindow(-10.0. 10.0. -10.0. 10.0):
cvs.setViewportdO. 460. 10. 460):
cvs.moveTo(0. -10.0): // draw a line // рисуем линию
cvs.lineTotO. 10.0):
продолжением
Дополнительные инструменты для рисования
Листинг 3.7 (продолжение)
RealRect Ьох( -2.0. 2.0. -1.0. 1.0): // construct a box // создаем прямоугольник
box.drawO: // draw the box // рисуем прямоугольник
}
//««««««<« main »»»»»>
void main(void)
{
// the window is opened in the Canvas constructor // это окно открывается в конструкторе Canvas
cvs.setBackgroundColord.O. 1.0. 1.0): // background is white // цвет фона белый
cvs.setColor(0.0. 0.0. 0.0); // set drawing color // устанавливаем цвет рисования
glutDisplayFunc(display):
glutMalnLoopO:
}
Подпрограмма mainO не совершает никакой инициализации: все уже было сделано в конструкторе Canvas. Подпрограмма mainf) просто устанавливает цвета рисования и фона, регистрирует функцию display О и входит в главный цикл событий. (Могли бы эти специфические для OpenGL функции быть «упрятаны» среди функций-членов класса Canvas?)
3.4.2. Реализация класса Canvas
Покажем теперь некоторые подробности реализации класса Canvas для случая, когда OpenGL доступен. (В тематическом задании 3.4 рассматривается альтернативная реализация.) Конструктор, приведенный в листинге 3.8, передает желаемые ширину и высоту (в пикселах) функции glutlnitWindowSizeO. а нужную титульную строку в glutCreateWindowO. Несколько обеспокоить может передача функции glutlnitO нужных параметров, несмотря на то, что они здесь никак не используются. Обычно main О передает в glutlnitO аргументы командной строки, как мы видели раньше. Здесь этого сделать нельзя, поскольку используется глобальный объект класса Canvas cvs, который создается раньше, чем вызывается mainO.