rendered paste body// am_image.h:#ifndef AM_IMAGE_H#define AM_IMAGE_H#include <gtkmm.h>namespace absement { class AmImage : public Gtk::Image { public: AmImage(Glib::RefPtr<Gdk::Pixbuf>& pixbuf, Gtk::TreeIter iter); virtual ~AmImage(); protected: Gtk::TreeIter m_iter; virtual void on_size_request(Gtk::Requisition* requisition); virtual bool on_expose_event(GdkEventExpose* event); };};#endif////////////////////////////////////////////// am_image.cc#include "am_image.h"#include <iostream>namespace absement { AmImage::AmImage(Glib::RefPtr<Gdk::Pixbuf>& pixbuf, Gtk::TreeIter iter) : Gtk::Image(pixbuf) { m_iter = iter; } AmImage::~AmImage() {} void AmImage::on_size_request(Gtk::Requisition* requisition) { Gtk::Image::on_size_request(requisition); requisition->width += 4; requisition->height += 4; } bool AmImage::on_expose_event(GdkEventExpose* event) { Glib::RefPtr<Gdk::Drawable> window = Glib::wrap(event->window, true); Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); window.clear(); int w, h; w = get_width(); h = get_height(); Gdk::Rectangle rect(&event->area); std::cout << rect.get_x() << ", " << rect.get_y() << " " << rect.get_width() << "x" << rect.get_height() << "\n"; cr->save(); cr->rectangle(rect.get_x(), rect.get_y(), rect.get_width(), rect.get_height()); cr->clip(); //cr->begin_new_path(); cr->rectangle(rect.get_x(), rect.get_y(), w, h); cr->set_operator(Cairo::OPERATOR_IN); cr->set_line_width(2.0); cr->set_antialias(Cairo::ANTIALIAS_NONE); cr->stroke(); cr->restore(); // adjust event->area.x += 2; event->area.y += 2; return Gtk::Image::on_expose_event(event); }};