Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Пожалуйста, обратите внимание на то, что координаты y возрастают по направлению вниз. Математикам это покажется странным, но экраны (и окна, возникающие на экране) могут иметь разные размеры, и верхняя левая точка — это единственное, что у них есть общего.
Количество пикселей зависит от экрана: самыми распространенными являются 1024×768, 1280×1024, 1450×1050 и 1600×1200. В контексте взаимодействия с компьютером окно рассматривается как прямоугольная область экрана, имеющая определенное предназначение и управляемая программой. Окно размечается точно так же, как и экран. В принципе окно можно интерпретировать как маленький экран.
Например, если программа содержит инструкцию
Simple_window win(tl,600,400,"Canvas");
то это значит, что мы хотим создать прямоугольную область, ширина которой равна 600 пикселям, а высота — 400, чтобы адресовать ее от 0 до 599 слева направо и от 0 до 399 сверху вниз. Область окна, которую можно изобразить на экране, называется канвой (canvas). Область 600×400 считается внутренней областью окна, т.е. область, расположенной в системном кадре; она не содержит строки заголовка, кнопок выхода и пр.
12.6. Класс Shape
Наш основной набор инструментов для рисования на экране состоит из двенадцати классов.
Стрелка означает, что класс, из которого она выходит, может быть использован там, где требуется класс, на который она указывает. Например, класс Polygon может быть использован там, где требуется класс Shape; иначе говоря, класс Polygon является разновидностью класса Shape.
Сначала опишем использование следующих классов:
• Simple_window, Window
• Shape, Text, Polygon, Line, Lines, Rectangle, Function и т.д.
• Color, Line_style, Point
• Axis
Позднее (в главе 16) добавим к ним классы графического пользовательского интерфейса:
• Button, In_box, Menu и т.д.
К этому набору можно было бы более или менее легко добавить много других классов, например
• Spline, Grid, Block_chart, Pie_chart и т.д.
Однако описание полного набора инструментов для создания графического пользовательского интерфейса со всеми его возможностями выходит за рамки нашей книги.
12.7. Использование графических примитивов
В этом разделе мы рассмотрим некоторые элементарные примитивы нашей графической библиотеки: Simple_window, Window, Shape, Text, Polygon, Line, Lines, Rectangle, Color, Line_style, Point, Axis. Цель этого обзора — дать читателям представление о том, что можно сделать с помощью этих средств без углубления в детали реализации этих классов. Каждый из этих классов будет подробно изучен в следующих главах.
Начнем с простой программы, объясняя ее строчка за строчкой и демонстрируя результаты ее работы на экране. Когда вы запустите эту программу, то увидите, как изменяется изображение при добавлении новых и модификации существующих фигур, расположенных в окне. В принципе такой анализ напоминает анимацию.
12.7.1. Графические заголовочные файлы и функция main
Во-первых, включим заголовочные файлы, в которых определены графические классы и класс графического пользовательского интерфейса.
#include "Window.h" // обычное окно
#include "Graph.h"
или
#include "Simple_window.h" // если нам нужна кнопка Next
#include "Graph.h"
Как вы, возможно, уже догадались, файл Window.h содержит средства, связанные с окнами, а файл Graph.h — инструменты, связанные с рисованием фигур (включая текст) в окне. Эти средства определены в пространстве имен Graph_lib. Для упрощения обозначений мы используем директиву using namespace, чтобы получить доступ к именам из пространства Graph_lib.
using namespace Graph_lib;
Как обычно, функция main() содержит код, который мы хотим выполнить (прямо или косвенно), а также обработку исключительных ситуаций.
int main ()
try
{
// ...здесь находится наш код...
}
catch(exception& e) {
// сообщения об ошибках
return 1;
}
catch(...) {
// другие сообщения об ошибках
return 2;
}
12.7.2. Почти пустое окно
Здесь мы не будем обсуждать обработку ошибок (см. главу 5, в частности раздел 5.6.3), а сразу перейдем к описанию графики в функции main():
Point tl(100,100); // левый верхний угол нашего окна
Simple_window win(tl,600,400,"Canvas");
// координаты окна tl задают положение левого верхнего угла
// размер окна 600*400
// заголовок: Canvas
win.wait_for_button(); // изобразить!
Этот фрагмент программы создает объект класса Simple_window, т.е. окно с кнопкой Next, и выводит его на экран. Очевидно, что для создания объекта класса Simple_window нам необходима директива #include, включающая в программу заголовочный файл Simple_window.h, а не Window.h. Здесь мы указываем, в каком месте экрана должно появиться окно: его левый верхний угол должен находиться в точке Point(100,100). Это близко, но не очень близко к левому верхнему углу экрана. Очевидно, что Point — это класс, конструктор которого получает пару целых чисел и интерпретирует их как пару координат (x, y). Эту инструкцию можно было бы написать так:
Simple_window win(Point(100,100),600,400,"Canvas");
Однако мы хотим использовать точку (100,100) несколько раз, поэтому удобнее присвоить ей символическое имя. Число 600 — это ширина окна, 400 — его высота, а строка "Canvas" — метка, которую мы хотим поместить на рамке окна.
Для того чтобы окно действительно было нарисовано на экране, мы должны передать управление системе графического пользовательского интерфейса. Для этого вызываем функцию win.wait_for_button(). Результат показан на следующем рисунке.
На фоне нашего окна мы видим экран ноутбука (на всякий случай очищенный от лишних пиктограмм). Для любопытных людей, интересующихся деталями, не относящимися к делу, сообщаю, что эту фотографию я сделал, стоя возле библиотеки Пикассо в Антибе и глядя через залив на Ниццу. Черное консольное окно, частично скрытое нашим окном, автоматически открывается при запуске нашей программы. Консольное окно выглядит некрасиво, но позволяет эффективно закрыть наше окно при отладке программы, если мы попадем в бесконечный цикл