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`
結果
