Читаем Программирование онлайн бесплатно
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, имеющие очевидный смысл. Вы можете удивиться: зачем нужен “невидимый цвет”. Оказывается, он может быть очень полезен для того, чтобы скрыть часть фигуры на экране.
Нарисовав на экране несколько линий, мы можем различать их по цвету, стилю или по обоим этим признакам. Стиль линии — это шаблон, задающий ее внешний вид. Класс 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, // -..-..
};
Line_style(Line_style_type ss):s(ss), w(0) { }
Line_style(Line_style_type lst, int ww):s(lst), w(ww) { }
Line_style(int ss):s(ss), w(0) { }
int width() const { return w; }
int style() const { return s; }
private:
int s;
int w;
};




