Программирование. Принципы и практика использования C++ Исправленное издание, стр. 185
Класс
MarkMarksПочему в качестве метки используется символ? Можно было бы нарисовать любую маленькую фигуру, но символы нагляднее и проще. Они часто позволяют отделить одно множество точек от другого. К тому же такие символы, как
xo+*13.17. Класс Image
Файлы в типичном персональном компьютере хранят тысячи изображений. Кроме того, миллионы изображений доступны в сети веб. Естественно, мы хотели бы отображать содержимое этих файлов на экране с помощью относительно простых программ. Например, ниже продемонстрирован рисунок (
rita_path.gifМы можем выбрать часть этого изображения и добавить фотографию урагана, сделанную из космоса (
rita.jpgImage rita(Point(0,0),"rita.jpg");Image path(Point(0,0),"rita_path.gif");path.set_mask(Point(50,250),600,400); // выбираем желательную областьwin.attach(path);win.attach(rita);Операция
set_mask()rita_path.gifpath
Фигуры изображаются одна поверх другой, подобно листам бумаги, в порядке их добавления на экран. По этой причине объект
pathritastruct Suffix { enum Encoding { none, jpg, gif };};В нашей библиотеке графического интерфейса изображение в памяти представляется как объект класса
Imagestruct Image:Shape { Image(Point xy, string file_name, Suffix::Encoding e = Suffix::none); ~Image() { delete p; } void draw_lines() const; void set_mask(Point xy, int ww, int hh) { w=ww; h=hh; cx=xy.x; cy=xy.y; }private: int w,h; // определяем "маскировочное окно" внутри изображения // по отношению к позиции (cx,cy) int cx,cy; Fl_Image* p; Text fn;};Конструктор класса
ImageImageBad_imageBad_imagestruct Bad_image:Fl_Image { Bad_image(int h, int w):Fl_Image(h,w,0) { } void draw(int x,int y, int, int, int, int) { draw_empty(x,y); }};Работа с изображениями в графической библиотеке довольно сложна, но основная сложность класса
Image// более сложный конструктор, потому что ошибки,// связанные с графическими файлами, трудно найтиImage::Image(Point xy, string s, Suffix::Encoding e) :w(0), h(0), fn(xy,""){ add(xy); if (!can_open(s)) { // можно ли открыть файл s? fn.set_label("Невозможно открыть \""+s+" "); p = new Bad_image(30,20); // ошибка графики return; } if (e == Suffix::none) e = get_encoding(s); switch(e) { // проверка кодировки case Suffix::jpg: p = new Fl_JPEG_Image(s.c_str()); break; case Suffix::gif: p = new Fl_GIF_Image(s.c_str()); break; default: // неприемлемая кодировка fn.set_label("Неприемлемый тип файла \""+s+" "); p = new Bad_image(30,20); // ошибка графики }}