#ifdef HAVE_CONFIG_H # include #endif #include #include "callbacks.h" #include "interface.h" #include "support.h" /* 直線の始点座標 */ int x0=0,y0=0; /* 前回のマウスの位置記憶用 */ int x1=0,y1=0; /* ラバーバンド描画用GC */ GdkGC *rubber_gc=NULL; /* drawingareaの生成時に呼び出されるハンドラ drawingareaの背景と、ラバーバンドの描画に 使用するGCを設定している */ void on_drawingarea_realize (GtkWidget *widget, gpointer user_data) { /* drawingareaの背景色を白に設定 */ GdkColor bgcolor; bgcolor.red = 0xffff; bgcolor.green=0xffff; bgcolor.blue=0xffff; gdk_color_alloc(gdk_colormap_get_system(),&bgcolor); gtk_widget_modify_bg(widget,GTK_STATE_NORMAL,&bgcolor); /* グラフィックコンテキストを生成 */ rubber_gc = gdk_gc_new(widget->window); /* 描画色の設定 */ GdkColor color; color.red = 0; color.green = 0xffff; color.blue = 0xffff; gdk_color_alloc(gdk_colormap_get_system(), &color); gdk_gc_set_foreground(rubber_gc, &color); /* XOR描画モードに設定する */ gdk_gc_set_function(rubber_gc, GDK_XOR); } /* drawingareaが表示されるときに呼び出されるハンドラ 赤い四角形を描画している */ gboolean on_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { /* 赤い四角の描画用GC */ static GdkGC *red_gc=NULL; GdkColor color; /* 色設定用 */ x1=x0; y1=y0; if(red_gc==NULL) { /* GCの生成と描画色の設定 */ red_gc = gdk_gc_new(widget->window); color.red = 0xffff; color.green = 0; color.blue = 0; gdk_color_alloc(gdk_colormap_get_system(), &color); gdk_gc_set_foreground(red_gc,&color); } /* DrawingAreaの幅と高さ */ gint width = widget->allocation.width; gint height= widget->allocation.height; /* drawingareaの半分の大きさの四角を描画 */ gdk_draw_rectangle(widget->window,red_gc,TRUE,width/4,height/4,width/2,height/2); return FALSE; } /* drawingareaの中でマウスが動いたときに 呼び出されるハンドラ この中でラバーバンドの描画を行っている */ gboolean on_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { /* 始点と現在のマウスの位置の間に直線を描画 */ gdk_draw_line(widget->window,rubber_gc,x0,y0,(gint)event->x,(gint)event->y); /* 始点と前回のマウス位置の間に直線を描画 これにより前回の線が消去される */ gdk_draw_line(widget->window,rubber_gc,x0,y0,x1,y1); /* 現在のマウスポインタの位置を保存 */ x1=(gint)event->x; y1=(gint)event->y; return FALSE; }