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

    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, // -..-..

  };


  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;

};


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