13.4. Класс Color
Color
— это тип, описывающий цвет. Его можно использовать примерно так:
grid.set_color(Color::red);
Эта инструкция окрашивает линии, определенные в объекте
grid
, в красный цвет. В итоге получается приведенное ниже изображение.
Класс
Color
определяет понятие цвета и приписывает символические имена нескольким наиболее распространенным цветам.
struct Color {
enum Color_type {
red=FL_RED,
blue=FL_BLUE,
green=FL_GREEN,
yellow=FL_YELLOW,
white=FL_WHITE,
black=FL_BLACK,
magenta=FL_MAGENTA,
cyan=FL_CYAN,
dark_red=FL_DARK_RED,
dark_green=FL_DARK_GREEN,
dark_yellow=FL_DARK_YELLOW,
dark_blue=FL_DARK_BLUE,
dark_magenta=FL_DARK_MAGENTA,
dark_cyan=FL_DARK_CYAN
};
enum Transparency { invisible = 0, visible=255 };
Color(Color_type cc) :c(Fl_Color(cc)), v(visible) { }
Color(Color_type cc, Transparency vv) :c(Fl_Color(cc)), v(vv)
{ }
Color(int cc) :c(Fl_Color(cc)), v(visible) { }
Color(Transparency vv) :c(Fl_Color()), v(vv) { } // цвет по
// умолчанию
int as_int() const { return c; }
char visibility() const { return v; }
void set_visibility(Transparency vv) { v=vv; }
private:
char v; // видимый или невидимый
Fl_Color c;
};
Предназначение класса
Color
заключается в следующем.
• Скрыть реализацию цвета в классе
Fl_Color
из библиотеки FLTK.
• Задать константы, соответствующие разным цветам.
• Обеспечить простую реализацию прозрачности (видимый или невидимый).
Цвет можно выбрать следующим образом.
• Выбрать константу из списка, например
Color::dark_blue
.
• Выбрать цвет из небольшой палитры, которую большинство программ выводит на экран (им соответствуют значения в диапазоне от 0–255; например, выражение
Color(99)
означает темно-зеленый цвет). Пример такой программы приведен в разделе 13.9.
• Выбрать значение в системе RGB (Red, Green, Blue — красный, зеленый, синий), которую мы здесь обсуждать не будем. При необходимости читатели сами в ней разберутся. В частности, можно просто ввести запрос “RGB color” в поисковую веб-машину. Среди прочих вы получите ссылки www.hyperso-lutions.org/rgb.html и www.pitt.edu/~nisg/cis/web/cgi/rgb.html. См. также упр. 13 и 14.
Обратите внимание на конструкторы класса
Color
, позволяющие создавать объекты как из объектов типа
Color_type
, так и из обычных чисел типа
int
. Каждый конструктор инициализирует член
c
. Вы можете возразить, что переменная c названа слишком коротко и непонятно, но, поскольку она используется в очень небольшой части класса
Color
и не предназначена для широкого использования, это не является недостатком. Мы поместили член
c
в закрытый раздел, чтобы защитить его от непосредственного обращения пользователей. Для представления члена c мы используем тип
Fl_Color
, определенный в библиотеке FLTK, который хотели бы скрыть от пользователей. Однако очень часто этот тип интерпретируется как целочисленное представление значения RGB (или другого значения), поэтому на этот случай мы предусмотрели функцию
as_int()
. Обратите внимание на то, что функция
as_int()
является константной функцией-членом, поскольку она не изменяет объект класса
Color
, который ее использует.
Прозрачность задается членом
v
, который может принимать значения
Color::visible
и
Color::invisible
, имеющие очевидный смысл. Вы можете удивиться: зачем нужен “невидимый цвет”. Оказывается, он может быть очень полезен для того, чтобы скрыть часть фигуры на экране.
13.5. Класс Line_style
Нарисовав на экране несколько линий, мы можем различать их по цвету, стилю или по обоим этим признакам. Стиль линии — это шаблон, задающий ее внешний вид. Класс
Line_style
используется приблизительно так:
grid.set_style(Line_style::dot);
Эта инструкция выводит на экран линии, заданные в объекте
grid
, как последовательность точек, а не как сплошную линию.
Это сделает сетку немного тоньше, зато более незаметной. Настраивая ширину (толщину) линий, можем придать сетке требуемый вид.
Класс
Line_style
выглядит так:
struct Line_style {
enum Line_style_type {
solid=FL_SOLID, // -------
dash=FL_DASH, // - - - -
dot=FL_DOT, // .......
dashdot=FL_DASHDOT, // - . - .
dashdotdot=FL_DASHDOTDOT, // -..-..