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

на главную - закладки

Жанры

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

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

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

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

Поделиться:
Популярные книги

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

(не)Бальмануг. Дочь 2

Лашина Полина
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг. Дочь 2

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Аномальный наследник. Том 3

Тарс Элиан
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Аномальный наследник. Том 3

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2