Text is drawn via Pango Layouts. The easiest way to create a Pango::Layout is to use create_pango_layout. Once created, the layout can be manipulated in various ways, including changing the text, font, etc. Finally, the layout can be rendered using the draw_layout method of Gdk::Drawable, which takes the usual Gdk::GC, an x-position, a y-position and the layout itself.
Here's a sample program using all of the drawing methods shown so far:
File: customdrawingarea.h
#ifndef GTKMM_EXAMPLE_DRAWINGAREATEXT_H #define GTKMM_EXAMPLE_DRAWINGAREATEXT_H #include <gtkmm.h> class CustomDrawingArea : public Gtk::DrawingArea { public: CustomDrawingArea(int x_size = 0, int y_size = 0); bool on_expose_event(GdkEventExpose* event); protected: int m_width, m_height; }; #endif //GTKMM_EXAMPLE_DRAWINGAREATEXT_H
File: testwindow.h
#ifndef GTKMM_EXAMPLE_DATTESTWIN_H #define GTKMM_EXAMPLE_DATTESTWIN_H #include "customdrawingarea.h" class TestWindow : public Gtk::Window { public: TestWindow(); private: CustomDrawingArea m_drawing_area; }; #endif
File: customdrawingarea.cc
#include "customdrawingarea.h" #include <pangomm/layout.h> CustomDrawingArea::CustomDrawingArea(int x_size, int y_size) : DrawingArea(), m_width(x_size), m_height(y_size) { set_size_request(m_width, m_height); //TODO: Why do we store m_width and m_height? murrayc } //Expose_event method. bool CustomDrawingArea::on_expose_event(GdkEventExpose*) { Glib::RefPtr<Gdk::Window> win = get_window(); Glib::RefPtr<Gdk::GC> some_gc = Gdk::GC::create(win); Glib::RefPtr<Gdk::GC> blackgc = get_style()->get_black_gc(); Glib::RefPtr<Gdk::GC> whitegc = get_style()->get_white_gc(); Gdk::Color some_color; Glib::RefPtr<Gdk::Colormap> some_colormap = get_default_colormap(); some_color.set_red(65535); some_color.set_green(65535); some_color.set_blue(0); some_colormap->alloc_color(some_color); some_gc->set_foreground(some_color); //Draw pac-man. win->draw_arc(some_gc, true, 30, 100, 50, 50, 2880, 17280); //2880==45*64, 17280==270*64 //Draw pellets. win->draw_rectangle(whitegc, true, 80, 120, 15, 10); win->draw_rectangle(whitegc, true, 110, 120, 15, 10); win->draw_rectangle(whitegc, true, 140, 120, 15, 10); //Draw some lines. win->draw_line(blackgc, 5, 2, 5, 20); win->draw_line(blackgc, 5, 11, 10, 11); win->draw_line(blackgc, 10, 2, 10, 20); win->draw_line(blackgc, 15, 2, 21, 2); win->draw_line(blackgc, 18, 2, 18, 20); win->draw_line(blackgc, 15, 20, 21, 20); //Draw a diamond. std::vector<Gdk::Point> some_points; some_points.push_back(Gdk::Point(100, 10)); some_points.push_back(Gdk::Point(50, 60)); some_points.push_back(Gdk::Point(100, 110)); some_points.push_back(Gdk::Point(150, 60)); win->draw_polygon(blackgc, true, some_points); //Draw some text. Glib::RefPtr<Pango::Layout> pangolayout = create_pango_layout("Hello, World!"); win->draw_layout(blackgc, 30, 170, pangolayout); // return true to stop any other event handlers being called to // draw this area return true; }
File: main.cc
#include "testwindow.h" int main(int argc, char *argv[]) { Gtk::Main main_runner(argc, argv); TestWindow foo; main_runner.run(foo); return 0; }
File: testwindow.cc
#include "testwindow.h" TestWindow::TestWindow() : m_drawing_area(200, 200) { add(m_drawing_area); show_all_children(); }
The structure of the program is the same as the first one, except that this one includes examples of the drawing elements discussed up to now.