Шрифт:
// используем объект rect
for (int i=0; i<rect.size; ++i) rect[i].move(10,10);
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
в виде матрицы 16x16. Мы приписали объектам класса Rectangle
цвета 0, 1, 2, 3, 4 и т.д. После создания каждого из объектов этого типа они выводятся на экран. < image l:href="#"/> 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
(см. примеры в разделах 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
. Размер и шрифт символов выбираются аналогично. В классе предусмотрено небольшое количество заранее определенных шрифтов.