Литмир - Электронная Библиотека
A
A

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

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

 

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

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

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

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

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
, добавляем его в окне и выводим на экран.

170
{"b":"847443","o":1}