#include #include #include #include #include #include #include #include #include typedef struct{ GtkBuilder *GTKBUILDER;//ウインドウのオブジェクト一覧 GtkWidget *ParentWindow; GtkWidget *Canvas; //ウインドウのオブジェクトを扱う構造体メンバー GtkWidget *DrawButton; //ウインドウのオブジェクトを扱う構造体メンバー GtkWidget *Clear; //ウインドウのオブジェクトを扱う構造体メンバー GtkWidget *window1; //ウインドウのオブジェクトを扱う構造体メンバー } WINDOW_GLOBAL; typedef struct{ int x,y; int ClearSw; } OBJECT_GLOBAL; WINDOW_GLOBAL Win; OBJECT_GLOBAL OBJ; WINDOW_GLOBAL *GetPWin(){ return &Win; } OBJECT_GLOBAL *GetPOBJ(){ return &OBJ; } void Repaint(){ gtk_widget_queue_draw_area(GetPWin()->Canvas,0,0,599,199);//強制書き換えイベント発生 } void DrawButton_clicked_cb(GtkWidget *widget, GdkEventExpose *eev, gpointer data){ GetPOBJ()->ClearSw=1; GetPOBJ()->x += 10; Repaint(); //強制書き換えイベント発生関数 } //////エクスポーズイベントで使用。glade-3で必ずdrawingareaのexpose-eventにこの関数を登録すること /////描画に関することはすべてここで行う void draw_gtk(GtkWidget *widget, GdkEventExpose *eev, gpointer data){ gint pen_radius = 1; cairo_t *cr; cr = gdk_cairo_create (widget->window); cairo_set_source_rgb (cr, 1,1,1); //色指定 cairo_paint (cr); //塗りつぶし if(GetPOBJ()->ClearSw!=0){//GetPOBJ()->ClearSwの値で描画するかしないか決める cairo_set_line_width (cr, pen_radius);//線幅指定 cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1);//色指定 cairo_move_to (cr,GetPOBJ()->x,0); //ペンの移動 cairo_line_to (cr,200,100); //線を引く cairo_stroke(cr); //上記命令を実行 cairo_destroy (cr); //crの中身を破棄 } } void Clear_clicked_cb(GtkWidget *widget, GdkEventExpose *eev, gpointer data){ GetPOBJ()->ClearSw=0; Repaint(); //強制書き換えイベント発生関数 } void ObjectLinker(GtkBuilder *builder){ ////ウインドウのオブジェクトを扱う構造体メンバーにオブジェクトを登録 GtkWidget *canvas = NULL; /* Make a new canvas */ GetPWin()->Canvas=canvas = GTK_WIDGET(gtk_builder_get_object( builder, "drawingarea")); gtk_widget_set_size_request (canvas, 600, 300);//キャンバスサイズを設定 GetPWin()->DrawButton= GTK_WIDGET(gtk_builder_get_object( builder, "DrawButton")); GetPWin()->Clear= GTK_WIDGET(gtk_builder_get_object( builder, "Clear")); GetPWin()->window1= GTK_WIDGET(gtk_builder_get_object( builder, "window1")); } int main(int argc, char* argv[]) { GtkBuilder *builder; GError *err=NULL; gtk_init(&argc, &argv); builder=gtk_builder_new();//Sample.gladeを記録する領域を作成 gtk_builder_add_from_file(builder,"Sample.glade",&err);//Sample.gladeを読み込む if (err) { // g_error(err->message); g_error_free(err); return 1; } GetPOBJ()->x=0; GetPOBJ()->ClearSw=1; GetPWin()->GTKBUILDER= builder;//ウインドウのオブジェクト一覧を登録 ObjectLinker(builder); gtk_builder_connect_signals(builder,NULL);//シグナルの結合 g_object_unref(G_OBJECT(builder)); gtk_widget_show(GTK_WIDGET(GetPWin()->window1));//ウインドウを表示 gtk_main();//ここで無限ループ return 0; }