Читаем Программирование полностью

  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 (см. примеры в разделах 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; }

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