多角形を描く
概要
Gtk::DrawingAreaに多角形を表示する。基本的には線を引くときと同様にon_expose_event()の中で get_window()->draw_polygon()によって描画できるが、 引数としてGdk::Pointを使った頂点のリストを渡す必要がある。
ソース
layout.cpp#include <gtkmm.h> #include <list> enum { C_WHITE = 0, C_BLACK, C_NUM }; class MyDrawArea : public Gtk::DrawingArea { Glib::RefPtr< Gdk::GC > m_gc; Gdk::Color m_col[ C_NUM ]; public: MyDrawArea(); protected: virtual void on_realize(); virtual bool on_expose_event( GdkEventExpose* e ); }; MyDrawArea::MyDrawArea() { // カラーマップの登録 m_col[ C_WHITE ] = Gdk::Color( "white" ); m_col[ C_BLACK ] = Gdk::Color( "black" ); Glib::RefPtr< Gdk::Colormap > colmap = get_default_colormap(); for( int i = 0; i < C_NUM; ++i ) colmap->alloc_color( m_col[ i ] ); } 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 = get_width(); int height =get_height(); // 背景の塗りつぶし get_window()->set_background( m_col[ C_BLACK ] ); get_window()->clear(); std::list< Gdk::Point > list_points; Gdk::Point point; for( int i = 0; i < 20; ++i ){ point.set_x( rand() % width ); point.set_y( rand() % height ); list_points.push_back( point ); } // 多角形 m_gc->set_foreground( m_col[ C_WHITE ] ); get_window()->draw_polygon( m_gc, true, list_points ); 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++ poly.cpp -o poly `pkg-config gtkmm-2.4 --cflags --libs`
結果
