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
Rectangle
, организованный в объекте класса Window
в виде матрицы 16×16. Мы приписали объектам класса Rectangle
цвета 0, 1, 2, 3, 4 и т.д. После создания каждого из объектов этого типа они выводятся на экран.13.11. Класс Text
Очевидно, что нам необходимо выводить на экран текст. Например, мы могли бы пометить “странный” объект класса Closed_polyline
Text t(Point(200,200),"A closed polyline that isn't a polygon");
t.set_color(Color::blue);
В этом случае мы получим такое изображение.
В принципе объект класса Text
Point
. Этот объект класса Point
находится в левом нижнем углу текста. Мы ограничиваемся одной строкой, поскольку хотим, чтобы наша программа выполнялась на многих компьютерах. Не пытайтесь вставлять в окно символ перехода на новую строку. Для создания объектов класса string
, подлежащих выводу на экран в объектах класса Text
(см. примеры в разделах 12.7.7 и 12.7.8), очень полезны строковые потоки (см. раздел 11.4).struct Text:Shape {
// точка в левом нижнем углу первой буквы
Text(Point x, const string& s)
:lab(s), fnt(fl_font()), fnt_sz(fl_size())
{ add(x); }
void draw_lines() const;
void set_label(const string& s) { lab = s; }
string label() const { return lab; }
void set_font(Font f) { fnt = f; }
Font font() const { return fnt; }
void set_font_size(int s) { fnt_sz = s; }
int font_size() const { return fnt_sz; }
private:
string lab; // label
Font fnt;
int fnt_sz;
};
Класс Text
draw_lines()
, поскольку только он знает, как хранится его строка.void Text::draw_lines() const
{
fl_draw(lab.c_str(),point(0).x,point(0).y);
}
Цвет символов определяется точно так же, как в фигурах, состоящих из линий (например, Open_polyline
Circle
), поэтому можем выбирать новый цвет с помощью функции set_color()
, а определять текущий цвет — с помощью функции color()
. Размер и шрифт символов выбираются аналогично. В классе предусмотрено небольшое количество заранее определенных шрифтов.class Font { // шрифт символа
public:
enum Font_type {
helvetica=FL_HELVETICA,
helvetica_bold=FL_HELVETICA_BOLD,
helvetica_italic=FL_HELVETICA_ITALIC,
helvetica_bold_italic=FL_HELVETICA_BOLD_ITALIC,
courier=FL_COURIER,
courier_bold=FL_COURIER_BOLD,
courier_italic=FL_COURIER_ITALIC,
courier_bold_italic=FL_COURIER_BOLD_ITALIC,
times=FL_TIMES,
times_bold=FL_TIMES_BOLD,
times_italic=FL_TIMES_ITALIC,
times_bold_italic=FL_TIMES_BOLD_ITALIC,
symbol=FL_SYMBOL,
screen=FL_SCREEN,
screen_bold=FL_SCREEN_BOLD,
zapf_dingbats=FL_ZAPF_DINGBATS
};
Font(Font_type ff):f(ff) { }
Font(int ff) :f(ff) { }
int as_int() const { return f; }
private:
int f;
};
Стиль определения класса Font
Color
(см. раздел 13.4) и Line_style
(см. раздел 13.5). 13.12. Класс Circle
Просто для того чтобы показать, что не все фигуры в мире являются прямоугольными, мы создали классы Circle
Ellipse
. Объект класса Circle
определяется центром и радиусом.struct Circle:Shape {
Circle(Point p, int rr); // центр и радиус
void draw_lines() const;
Point center() const;
int radius() const { return r; }