La operación de impresión utilizando gtkmm resulta muy simple y útil a la vez permitiendo la escritura de dibujos tanto en la impresora como en archivos PDF.
Supongamos que se tiene el siguiente código cairomm:
const double width = print_context->get_width();
const double height = print_context->get_height();
Cairo::RefPtr cairo_ctx = print_context->get_cairo_context();
cairo_ctx->set_source_rgb(0, 0, 0);
cairo_ctx->set_font_size(28.0);
std::string text("Taller de Programación - FIUBA");
Cairo::TextExtents extents;
cairo_ctx->get_text_extents(text, extents);
cairo_ctx->move_to (width/2.0 + - extents.x_bearing - extents.width/2, height/2.0);
cairo_ctx->show_text(text);
Este pequeño bloque obtiene el tamaño del contexto de impresión y dibuja el texto “Taller de Programación – FIUBA” en el centro. Las operaciones utilizadas se pueden encontrar en la referencia de cairomm o bien en el tutorial [1]. Es importante destacar que el código anterior sólo depende de un objeto llamado print_context que entrega un Cairo::Context pero que se puede adaptar fácilmente a un DrawingArea donde el Cairo::Context de dibujo es recibido por parámetro [2].
Para permitir la impresión del texto anterior es necesario definir una clase heredera de Gtk::PrintOperation y realizar la escritura en su print_context como se detalla a continuación:
class CustomPrintOperation : public Gtk::PrintOperation
{
public:
static Glib::RefPtr create();
protected:
virtual void on_begin_print(const Glib::RefPtr& context);
virtual void on_draw_page(const Glib::RefPtr& context, int page_nr);
};
Glib::RefPtr CustomPrintOperation::create()
{
return Glib::RefPtr(new CustomPrintOperation());
}
void CustomPrintOperation::on_begin_print(
const Glib::RefPtr& print_context)
{
set_n_pages(1);
}
void CustomPrintOperation::on_draw_page(const Glib::RefPtr& print_context, int page_nr)
{
const double width = print_context->get_width();
const double height = print_context->get_height();
Cairo::RefPtr cairo_ctx = print_context->get_cairo_context();
cairo_ctx->set_source_rgb(0, 0, 0);
cairo_ctx->set_font_size(28.0);
std::string text("Taller de Programación - FIUBA");
Cairo::TextExtents extents;
cairo_ctx->get_text_extents(text, extents);
cairo_ctx->move_to (width/2.0 + - extents.x_bearing - extents.width/2, height/2.0);
cairo_ctx->show_text(text);
void on_printoperation_done(Gtk::PrintOperationResult result, const Glib::RefPtr& operation)
{
[...] //realizar chequeo de finalización de operación.
}
Glib::RefPtr print = CustomPrintOperation::create();
print->set_track_print_status();
print->set_default_page_setup(m_refPageSetup);
print->set_print_settings(m_refSettings);
print->signal_done().connect(sigc::bind(sigc::ptr_fun(&on_printoperation_done), print));
try
{
print->run(Gtk::PRINT_OPERATION_ACTION_PRINT_DIALOG, currentWindow);
}
catch (const Gtk::PrintError& ex)
{
std::cerr << "An error occurred while trying to run a print operation:"
<< ex.what() << std::endl;
}
Como resultado se obtendrá un cuadro de diálogo de impresión que permitirá elegir entre una exportación a PDF o una impresión en papel del dibujo resultante del código cairomm antes visto.
Para más información sobre esta funcionalidad de gtkmm, referirse al capítulo de impresión del tutorial de gtkmm [3].
Se adjunta un ejemplo de código completo basado en mencionado tutorial:
[1] http://cairographics.org/tutorial/
[2] http://developer.gnome.org/gtkmm-tutorial/3.2/sec-cairo-drawing-model.html
[3] http://developer.gnome.org/gtkmm-tutorial/3.2/chapter-printing.html