Чтение онлайн

ЖАНРЫ

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

#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
. Результат показан на следующем рисунке.

На фоне нашего окна мы видим экран ноутбука (на всякий случай очищенный от лишних пиктограмм). Для любопытных людей, интересующихся деталями, не относящимися к делу, сообщаю, что эту фотографию я сделал, стоя возле библиотеки Пикассо в Антибе и глядя через залив на Ниццу. Черное консольное окно, частично скрытое нашим окном, автоматически открывается при запуске нашей программы. Консольное окно выглядит некрасиво, но позволяет эффективно закрыть наше окно при отладке программы, если мы попадем в бесконечный цикл и не сможем выйти из программы обычным способом. Если внимательно присмотреться, то можно заметить, что мы использовали компилятор Microsoft C++, но вместо него можно было бы использовать
любой другой компилятор (например, Borland или GNU).

Для дальнейшей демонстрации нашей программы мы удалили с экрана все лишнее, оставив только само окно (см. ниже).

Реальный размер окна (в дюймах) зависит от разрешающей способности вашего экрана. Кроме того, на некоторых экранах размер пикселей больше, чем на других.

12.7.3. Оси координат

Практически пустое окно не очень интересно, поэтому попробуем добавить в него какую-нибудь информацию. Что бы мы хотели изобразить? Давайте вспомним, что графика — это не только игры и развлечения, и сделаем что-нибудь серьезное и сложное, например оси координат. График без осей координат, как правило, ужасен. Невозможно себе представить, какие данные можно изобразить, не пользуясь осями координат. Может быть, вам удастся оправдать это в приложении к программе, но намного лучше добавить оси координат; люди часто не читают объяснений, а хорошее графическое представление обычно не нуждается в комментариях. Итак, нам необходимы координатные оси.

Axis xa(Axis::x, Point(20,300), 280, 10, "x axis"); // создаем

// объект Axis

// класс Axis — разновидность класса Shape

// Axis::x означает горизонтальную ось

// начало оси — в точке (20,300)

// длина оси — 280 пикселей 10 делений

// "Ось x" — метка оси

win.attach(xa); // связываем объект xa с окном win

win.set_label("Canvas #2"); // изменяем метку окна

win.wait_for_button; // изобразить!

Последовательность действий такова: создаем объект класса

Axis
, добавляем его в окне и выводим на экран.

Как видим, параметр

Axis::x
задает горизонтальную линию. Кроме того, ось имеет десять делений и метку “
x axis
”. Как правило, метка объясняет, что представляет собой ось и ее деления. Естественно, ось х следует выбирать где-то ближе к нижнему краю окна. В реальной программе мы обозначили бы ширину и высоту какими-нибудь символическими константами, чтобы придать фразе “где-то ближе к нижнему краю окна” конкретный смысл, например, выраженный в виде инструкции
y_max-bottom_margin
, и не использовали бы “магические константы”, такие как 300 (см. раздел 4.3.1, раздел 15.6.2).

Для того чтобы идентифицировать результаты, мы изменили метку экрана на строку "

Canvas #2
" с помощью функции-члена
set_label
класса
Window
.

Теперь добавим ось

y
.

Axis ya(Axis::y, Point(20,300), 280, 10, "y axis");

ya.set_color(Color::cyan); // выбираем цвет

ya.label.set_color(Color::dark_red); // выбираем цвет текста

win.attach(ya);

win.set_label("Canvas #3");

win.wait_for_button; // изобразить!

Просто для того чтобы продемонстрировать некоторые возможности, мы раскрасили ось

y
в голубой цвет (cyan), а метку сделали темно-красной.

На самом деле мы не считаем удачной идею присваивать разные цвета осям x и y. Мы просто хотели показать, как можно задать цвет фигуры и ее отдельных элементов. Использование большого количества цветов не всегда оправдано. В частности, новички часто злоупотребляют раскраской графиков, демонстрируя избыток энтузиазма и недостаток вкуса.

Поделиться с друзьями: