Программирование. Принципы и практика использования C++ Исправленное издание, стр. 181
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);Это приводит к следующему результату:

Обратите внимание на то, что цвет заполнения и цвет линии заданы параметром
invisiblerect22Поскольку мы должны работать как с цветом линии, так и с цветом заполнения, функция-член
draw_lines()Rectanglevoid 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>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;};Наше определение очень похоже на определение типа
vectorVector_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)));// используем объект rectfor (int i=0; i<rect.size(); ++i) rect[i].move(10,10);
Vector_refRectangle(Point(50,60),Point(80,90))Опытные программисты заметят, что в данном примере мы не допускаем утечки памяти. С помощью классов
RectangleVector_refVector_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_refRectangleWindowRectangle
13.11. Класс Text
Очевидно, что нам необходимо выводить на экран текст. Например, мы могли бы пометить “странный” объект класса
Closed_polylineText t(Point(200,200),"A closed polyline that isn't a polygon");