- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Заполнение цветом можно реализовать в конструкторе или в виде отдельной функции set_fill_color() (предусмотренной в классе Shape наряду с другими средствами для работы с цветом).
Rectangle rect00(Point(150,100),200,100);
Rectangle rect11(Point(50,50),Point(250,150));
Rectangle rect12(Point(50,150),Point(250,250)); // ниже rect11
Rectangle rect21(Point(250,50),200,100); // правее rect11
Rectangle rect22(Point(250,150),200,100); // ниже rect21
rect00.set_fill_color(Color::yellow);
rect11.set_fill_color(Color::blue);
rect12.set_fill_color(Color::red);
rect21.set_fill_color(Color::green);
В итоге получаем следующее изображение:
Если заполнение цветом не требуется, то прямоугольник считается прозрачным; вот почему вы видите желтый угол объекта rect00.
Фигуры можно передвигать в окне (см. раздел 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 квадратов и нарисуем их в матрице 16×16.
Вот что у нас получится.
Называть все эти 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)));
// используем объект rect
for (int i=0; i<rect.size(); ++i) rect[i].move(10,10);
Оператор new описан в главе 17, а реализация класса Vector_ref — в приложении Д. Пока достаточно знать, что мы можем использовать его для хранения неименованных объектов. За оператором new следует имя типа (в данном случае Rectangle) и, необязательно, список инициализации (в данном случае (Point(50,60),Point(80,90))).
Опытные программисты заметят, что в данном примере мы не допускаем утечки памяти. С помощью классов Rectangle и Vector_ref мы можем экспериментировать с цветами. Например, можем нарисовать простую диаграмму, состоящую из 256 цветов.
Vector_ref<Rectangle> vr;
for (int i = 0; i<16; ++i)
for (int j = 0; j<16; ++j) {
vr.push_back(new Rectangle(Point(i*20,j*20),20,20));
vr[vr.size()–1].set_fill_color(Color(i*16+j));
win20.attach(vr[vr.size()–1]);
}
Мы создали объект класса Vector_ref, состоящий из 256 объектов класса Rectangle, организованный в объекте класса Window в виде матрицы 16×16. Мы приписали объектам класса Rectangle цвета 0, 1, 2, 3, 4 и т.д. После создания каждого из объектов этого типа они выводятся на экран.
13.11. Класс Text
Очевидно, что нам необходимо выводить на экран текст. Например, мы могли бы пометить “странный” объект класса Closed_polyline из раздела 13.8.
Text t(Point(200,200),"A closed polyline that isn't a polygon");
t.set_color(Color::blue);
В этом случае мы получим такое изображение.
В принципе объект класса Text определяет строку текста, начиная с точки, заданной объектом класса Point. Этот объект класса Point находится в левом нижнем углу текста. Мы ограничиваемся одной строкой, поскольку хотим, чтобы наша программа выполнялась на многих компьютерах. Не пытайтесь вставлять в окно символ перехода на новую строку. Для создания объектов класса string, подлежащих выводу на экран в объектах класса Text (см. примеры