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 и т.д. После создания каждого из объектов этого типа они выводятся на экран.

<p id="AutBody_Root240"><strong>13.11. Класс Text</strong></p>

Очевидно, что нам необходимо выводить на экран текст. Например, мы могли бы пометить “странный” объект класса 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(). Размер и шрифт символов выбираются аналогично. В классе предусмотрено небольшое количество заранее определенных шрифтов.

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). 

<p id="AutBody_Root241"><strong>13.12. Класс Circle</strong></p>

 Просто для того чтобы показать, что не все фигуры в мире являются прямоугольными, мы создали классы Circle и Ellipse. Объект класса Circle определяется центром и радиусом.

struct Circle:Shape {

  Circle(Point p, int rr); // центр и радиус

  void draw_lines() const;

  Point center() const;

  int radius() const { return r; }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже