Gtk上的cairo(二)——画线小程序
#include <gtk/gtk.h>
struct {
double x[2];
double y[2];
} glob;
static cairo_surface_t *surface = NULL;
/*
* 在surface上绘制一条直线
*/
static void
do_drawing(GtkWidget *widget)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 1, 0, 0);
cairo_set_line_width (cr, 1);
cairo_move_to (cr, glob.x[0], glob.y[0]);
cairo_line_to (cr, glob.x[1], glob.y[1]);
cairo_stroke (cr);
cairo_destroy (cr);
gtk_widget_queue_draw (widget);
}
/*
* 清空surface
*/
static void
clear_surface (GtkWidget *widget)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_paint (cr);
cairo_destroy (cr);
gtk_widget_queue_draw (widget);
}
/*
* 鼠标左键按下时,记录坐标
* 鼠标右键按下时,清空绘图区域。
*/
static gboolean
button_press (GtkWidget *widget,
GdkEventButton *event,
gpointer user_date)
{
if (event->button == 1)
{
glob.x[0] = event->x;
glob.y[0] = event->y;
//g_print ("button = 1, x = %lf y = %lf\n", event->x, event->y);
}
if (event->button == 3)
clear_surface(widget);
//g_print ("button = 3, x = %lf y = %lf\n", event->x, event->y);
return TRUE;
}
/*
* 鼠标左键松开时,记录下第二个坐标并绘制直线
*/
static gboolean
button_release (GtkWidget *widget,
GdkEventButton *event,
gpointer user_date)
{
if (event->button == 1)
{
glob.x[1] = event->x;
glob.y[1] = event->y;
do_drawing(widget);
//g_print ("in release button = 1, x = %lf y = %lf\n", event->x, event->y);
}
return TRUE;
}
/*
* 根据cr绘制surface
*/
static void
draw_event (GtkWidget *widget,
cairo_t *cr,
gpointer user_date)
{
cairo_set_source_surface (cr, surface, 0, 0);
cairo_paint (cr);
}
/*
* 当widget大小改变时,重新创建一个适合大小的surface并清空新surface。
*/
static gboolean
configure_event (GtkWidget *widget,
GdkEventConfigure *event,
gpointer data)
{
if (surface)
cairo_surface_destroy (surface);
surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height (widget));
clear_surface(widget);
return TRUE;
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *darea;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new ();
gtk_container_add (GTK_CONTAINER(window), darea);
gtk_widget_set_size_request (darea, 400, 400);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
/*鼠标按钮下压信号*/
g_signal_connect (darea, "button-press-event", G_CALLBACK(button_press),NULL);
/*鼠标按钮释放信号*/
g_signal_connect (darea, "button-release-event", G_CALLBACK(button_release), NULL);
/*重绘时发出信号*/
g_signal_connect (darea, "draw", G_CALLBACK (draw_event), NULL);
/*控件大小改变时发出信号,包括窗口创建时*/
g_signal_connect (darea, "configure-event", G_CALLBACK (configure_event), NULL);
gtk_widget_set_events (darea, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}