Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Фигуры можно передвигать в окне (см. раздел 14.2.3). Рассмотрим пример.

rect11.move(400,0); // вправо от rect21

rect11.set_fill_color(Color::white);

win12.set_label("rectangles 2");

В итоге получим изображение, приведенное ниже.

Заметьте, что только часть белого прямоугольника

rect11
помещается в окне. То, что выходит за пределы окна, “отрезается”; иначе говоря, на экране эта часть не отображается.

Обратите внимание на то, как фигуры накладываются одна на другую. Это выглядит так, будто вы кладете на стол один лист бумаги на другой. Первый лист окажется в самом низу. Наш класс
Window
(раздел Д.3) реализует простой способ размещения фигуры поверх другой (используя функцию
Window::put_on_top
). Рассмотрим пример.

win12.put_on_top(rect00);

win12.set_label("rectangles 3");

В итоге получаем следующее изображение:

Отметьте, что мы можем видеть линии, образующие прямоугольник, даже если он закрашен. Если такое изображение нам не нравится, то линии можно удалить.

rect00.set_color(Color::invisible);

rect11.set_color(Color::invisible);

rect12.set_color(Color::invisible);

rect21.set_color(Color::invisible);

rect22.set_color(Color::invisible);

Это приводит к следующему результату:

Обратите внимание на то, что цвет заполнения и цвет линии заданы параметром

invisible
, поэтому прямоугольник
rect22
на экране больше не виден.

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

draw_lines
класса
Rectangle
становится немного запутанной.

void Rectangle::draw_lines const

{

if (fill_color.visibility) { // заполнение

fl_color(fill_color.as_int);

fl_rectf(point(0).x,point(0).y,w,h);

}

if (color.visibility) { // линии поверх заполнения

fl_color(color.as_int);

fl_rect(point(0).x,point(0).y,w,h);

}

}

Как видим, библиотека FLTK содержит функции для рисования как заполненных прямоугольников (

fl_rectf
), так и пустых (
fl_rect
). По умолчанию рисуются оба вида прямоугольников (пустой поверх заполненного).

13.10. Управление неименованными объектами

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

Вот что у нас получится.

Называть все эти 256 квадратов было бы не только утомительно, но и глупо. Очевидно, что “имя” левого верхнего квадрата в матрице определяется его местоположением в точке (0,0), а все остальные квадраты можно точно так же идентифицировать с помощью пар координат (i, j). Итак, нам необходим эквивалент матрицы объектов. Сначала мы подумали о векторе

vector<Rectangle>
, но оказалось, что он недостаточно гибок. Например, было бы неплохо иметь коллекцию неименованных объектов (элементов), не все из которых имеют одинаковые типы. Проблему гибкости мы обсудим в разделе 14.3, а здесь продемонстрируем наше решение: векторный тип, хранящий именованные и неименованные объекты.

template<class T> class Vector_ref {

public:

// ...

void push_back(T&); // добавляет именованный объект

void push_back(T*); // добавляет неименованный объект

T& operator[](int i); // индексация: доступ для чтения и записи

const T& operator[](int i) const;

int size const;

};

Наше определение очень похоже на определение типа

vector
из стандартной библиотеки.

Vector_ref<Rectangle> rect;

Rectangle x(Point(100,200),Point(200,300));

// добавляем именованные объекты

rect.push_back(x);

// добавляем неименованные объекты

rect.push_back(new Rectangle(Point(50,60),Point(80,90)));

  • Читать дальше
  • 1
  • ...
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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