ファイルから画像を読み込んで表示(Gtk::DrawingArea編)
概要
Gtk::DrawingAreaを使ってファイルから画像を読み込んでそれを表示させる。Gtk::DrawingAreaから派生クラスを作り、Gtk::Widget::on_realize()と Gtk::Widget::on_expose_event()をオーバロードする必要がある。on_realize()内で グラフィックコンテキスト(GC)を作成し、on_expose_event()でファイルを読み込んだ Gdk::PixbufをGdk::Drawable::draw_pixbuf()を使って描画する。
なお、Gtk::WindowとGdk::Windowは混同しやすいので気を付けること。 Gtk::WindowはWidgetであり、Gdk::Windowは描画領域である。
ソース
darea.cpp#include <gtkmm.h> class MyDrawArea : public Gtk::DrawingArea { Glib::RefPtr< Gdk::GC > m_gc; Glib::RefPtr< Gdk::Pixbuf > m_pixbuf; public: MyDrawArea(); protected: virtual void on_realize(); virtual bool on_expose_event( GdkEventExpose* e ); }; MyDrawArea::MyDrawArea() { try { m_pixbuf = Gdk::Pixbuf::create_from_file( "./test.png" ); } catch(...) { Glib::exception_handlers_invoke(); exit(1); } } void MyDrawArea::on_realize() { // 元のon_realize()のコールを忘れないこと Gtk::DrawingArea::on_realize(); // Gdk::Window からGCを作る m_gc = Gdk::GC::create( get_window() ); } bool MyDrawArea::on_expose_event( GdkEventExpose* event ) { int width = m_pixbuf->get_width(); int height = m_pixbuf->get_height(); // Gdk::Drawable::draw_pixbuf()でpixbufを描画 get_window()->draw_pixbuf( m_gc, m_pixbuf, 0, 0, 0, 0 , width, height, Gdk::RGB_DITHER_NONE, 0, 0 ); return true; } class MainWin : public Gtk::Window { MyDrawArea m_drawarea; public: MainWin(){ add( m_drawarea ); show_all_children(); } }; int main( int argc, char *argv[] ) { Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ darea.cpp -o darea `pkg-config gtkmm-2.4 --cflags --libs`
結果
