ファイルから画像を読み込んで表示(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`

結果