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