Литмир - Электронная Библиотека
A
A

t.set_color(Color::blue);

В этом случае мы получим такое изображение.

Программирование. Принципы и практика использования C++ Исправленное издание - _141.png

В принципе объект класса

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; }

  void set_radius(int rr) { r=rr; }

private:

  int r;

};

Использовать класс

Circle
можно следующим образом:

Circle c1(Point(100,200),50);

Circle c2(Point(150,200),100);

Circle c3(Point(200,200),150);

Эти инструкции рисуют три окружности разных радиусов, центры которых лежат на горизонтальной линии.

Программирование. Принципы и практика использования C++ Исправленное издание - _142.png

Основной особенностью реализации класса

Circle
является то, что в нем хранится не центр, а левая верхняя точка угла квадрата, окаймляющего окружность. Можно было бы хранить и центр окружности, но мы выбрали вариант, позволяющий библиотеке FLTK оптимизировать процесс рисования окружности. Это еще один пример того, как с помощью класса можно создать другое (предположительно, более точное) представление понятия, для реализации которого он предназначен.

182
{"b":"847443","o":1}