Чтение онлайн

на главную

Жанры

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

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

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

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

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

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

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

:r(rr)

{

add(Point(p.x–r,p.y–r)); // хранит левый верхний угол

}

Point Circle::center const

{

return Point(point(0).x+r, point(0).y+r);

}

void Circle::draw_lines const

{

Поделиться:
Популярные книги

Идущий в тени 4

Амврелий Марк
4. Идущий в тени
Фантастика:
боевая фантастика
6.58
рейтинг книги
Идущий в тени 4

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Метка драконов. Княжеский отбор

Максименко Анастасия
Фантастика:
фэнтези
5.50
рейтинг книги
Метка драконов. Княжеский отбор

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Темный охотник 6

Розальев Андрей
6. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный охотник 6

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Все еще не Герой!. Том 2

Довыдовский Кирилл Сергеевич
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Все еще не Герой!. Том 2

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

Попаданка в деле, или Ваш любимый доктор - 2

Марей Соня
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Чемпион

Демиров Леонид
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38
рейтинг книги
Чемпион