Dibujar imágenes
Hay un método para dibujar desde un Gdk::Pixbuf a un Cairo::Context. Un búfer Gdk::Pixbuf es un envoltorio útil alrededor de un grupo de píxeles, que puede leerse desde archivos y manipularse de varias maneras.
Probablemente la manera más común de crear un Gdk::Pixbuf es usar Gdk::Pixbuf::create_from_file(), que puede leer un archivo de imagen, como un archivo png, hacia un «pixbuf» listo para procesar.
El Gdk::Pixbuf puede procesarse estableciéndolo como el patrón fuente del contexto de Cairo con Gdk::Cairo::set_source_pixbuf(). Después, dibuje la imagen con Cairo::Context::paint() (para dibujar la imagen entera), o Cairo::Context::rectangle() y Cairo::Context::fill() (para rellenar el rectángulo especificado). set_source_pixbuf() no es un miembro de Cairo::Context. Toma un Cairo::Context como primer parámetro.
Aquí hay un poco de código que junta todo: (tenga en cuenta que normalmente no cargaría la imagen cada vez en el manejador de señal de dibujo. Se muestra aquí sólo para mantener a todo junto).
bool MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file("myimage.png"); // Draw the image at 110, 90, except for the outermost 10 pixels. Gdk::Cairo::set_source_pixbuf(cr, image, 100, 80); cr->rectangle(110, 90, image->get_width()-20, image->get_height()-20); cr->fill(); return true; }
- 17.6.1. Ejemplo
17.6.1. Ejemplo
Aquí hay un ejemplo de un programa simple que dibuja una imagen.
File: myarea.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLE_MYAREA_H #define GTKMM_EXAMPLE_MYAREA_H #include <gtkmm/drawingarea.h> #include <gdkmm/pixbuf.h> class MyArea : public Gtk::DrawingArea { public: MyArea(); virtual ~MyArea(); protected: //Override default signal handler: virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr); Glib::RefPtr<Gdk::Pixbuf> m_image; }; #endif // GTKMM_EXAMPLE_MYAREA_H
File: myarea.cc (For use with gtkmm 3, not gtkmm 2)
#include "myarea.h" #include <cairomm/context.h> #include <gdkmm/general.h> // set_source_pixbuf() #include <glibmm/fileutils.h> #include <iostream> MyArea::MyArea() { try { // The fractal image has been created by the XaoS program. // http://xaos.sourceforge.net m_image = Gdk::Pixbuf::create_from_file("fractal_image.png"); } catch(const Glib::FileError& ex) { std::cerr << "FileError: " << ex.what() << std::endl; } catch(const Gdk::PixbufError& ex) { std::cerr << "PixbufError: " << ex.what() << std::endl; } // Show at least a quarter of the image. if (m_image) set_size_request(m_image->get_width()/2, m_image->get_height()/2); } MyArea::~MyArea() { } bool MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { if (!m_image) return false; Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); // Draw the image in the middle of the drawing area, or (if the image is // larger than the drawing area) draw the middle part of the image. Gdk::Cairo::set_source_pixbuf(cr, m_image, (width - m_image->get_width())/2, (height - m_image->get_height())/2); cr->paint(); return true; }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "myarea.h" #include <gtkmm/application.h> #include <gtkmm/window.h> int main(int argc, char** argv) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); Gtk::Window win; win.set_title("DrawingArea"); win.set_default_size(300, 200); MyArea area; win.add(area); area.show(); return app->run(win); }