Gtk::DrawingAreaをGtk::ScrolledWindowの中に貼り付ける

概要

Gtk::DrawingAreaをGtk::ScrolledWindowの中に貼り付ける。

特別な事をしなくても自動でスクロール処理されるが、 「Gtk::DrawingAreaをGtk::ScrolledWindowにaddする前に Gtk::DrawingArea::set_size_request()で描画領域のサイズを指定しておかないと スクロールバーが表示されない」ので注意すること。

ソース

scroll2.cpp

#include <gtkmm.h>

class MyDrawArea : public Gtk::DrawingArea
{
    Glib::RefPtr< Gdk::GC > m_gc;

    Glib::RefPtr< Gdk::Pixbuf > m_pixbuf1;
    Glib::RefPtr< Gdk::Pixbuf > m_pixbuf2;
    Glib::RefPtr< Pango::Layout > m_layout;
    
public:

    MyDrawArea();

protected:

    virtual bool on_expose_event( GdkEventExpose* e );
};


MyDrawArea::MyDrawArea()
{
    // 予めGtk::DrawingAreaのサイズを指定しておかないと Gtk::ScrolledWindow に
    // 貼りつけてもスクロールバーが出てこないので注意
    set_size_request( 500, 500 );

    // 画像のロード
    try {
        m_pixbuf1 = Gdk::Pixbuf::create_from_file( "./test.png" );
        m_pixbuf2 = m_pixbuf1->scale_simple( 50, 50, Gdk::INTERP_NEAREST );
    }
    catch(...)
    {
      Glib::exception_handlers_invoke();
      exit(1);
    }

    // pango layout作成
    m_layout = create_pango_layout( "" );
    m_layout->set_font_description( Pango::FontDescription( "Serif 20" ) );
}


bool MyDrawArea::on_expose_event( GdkEventExpose* event )
{
    if( ! m_gc ) m_gc = Gdk::GC::create( get_window() );

    // 背景の塗りつぶし
    get_window()->set_background( Gdk::Color( "black" ) );
    get_window()->clear();

    // Gdk::Drawable::draw_layoutで文字描画
    m_layout->set_text("あいうえお");
    get_window()->draw_layout( m_gc, 50, 50, m_layout , Gdk::Color( "white" ), Gdk::Color( "black" ) );

    // Gdk::Drawable::draw_pixbuf()でpixbufを描画
    get_window()->draw_pixbuf( m_gc, m_pixbuf1, 0, 0,
                               50, 100, m_pixbuf1->get_width(), m_pixbuf1->get_height(),
                               Gdk::RGB_DITHER_NONE, 0, 0 );

    get_window()->draw_pixbuf( m_gc, m_pixbuf2, 0, 0,
                               250, 40, m_pixbuf2->get_width(), m_pixbuf2->get_height(),
                               Gdk::RGB_DITHER_NONE, 0, 0 );

    return true;
}


class MainWin : public Gtk::Window
{
    MyDrawArea m_drawarea;
    Gtk::ScrolledWindow m_scr;

public:
    MainWin();
};

MainWin::MainWin()
{
    // スクロールバー自動表示設定
    m_scr.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );

    // DrawingAreaを貼り付けて表示
    m_scr.add( m_drawarea );
    add( m_scr );
    resize( 300, 300 );
    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++ scroll2.cpp -o scroll2 `pkg-config gtkmm-2.4 --cflags --libs`

結果