/* draftpaper.c draft paper * Copyright (c) 2004 by SmartLu All Rights Reserved * Distributed under the terms of the GNU General Public License (GPL) * See the GNU Library General Public License for more details. */ #include "srecite.h" static GtkWidget *draft_win; static GtkWidget *drawing_area; static GtkWidget *quit_button,*reset_button; /* 绘制区的后端位图 */ static GdkPixmap *pixmap = NULL; /* 创建一个适当大小的后端位图 */ static gint configure_event( GtkWidget *widget, GdkEventConfigure *event ) { if (pixmap) g_object_unref (pixmap); pixmap = gdk_pixmap_new (widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE; } /* 从后端位图重新绘制屏幕 */ static gint expose_event( GtkWidget *widget, GdkEventExpose *event ) { gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } /* 在屏幕上绘制一个矩形 */ static void draw_brush( GtkWidget *widget, gdouble x, gdouble y) { GdkRectangle update_rect; update_rect.x = x - 3; update_rect.y = y - 3; update_rect.width = 6; update_rect.height = 6; gdk_draw_rectangle (pixmap, widget->style->black_gc, TRUE, update_rect.x, update_rect.y, update_rect.width, update_rect.height); gtk_widget_queue_draw_area (widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height); } /* erase big rectangle */ static void erase_brush( GtkWidget *widget, gdouble x, gdouble y) { GdkRectangle update_rect; update_rect.x = x - 10; update_rect.y = y - 10; update_rect.width = 20; update_rect.height = 20; gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, update_rect.x, update_rect.y, update_rect.width, update_rect.height); gtk_widget_queue_draw_area (widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height); } static gint button_press_event( GtkWidget *widget, GdkEventButton *event ) { if (event->button == 1 && pixmap != NULL) draw_brush (widget, event->x, event->y); //erase if (event->button == 3 && pixmap != NULL) erase_brush (widget, event->x, event->y); return TRUE; } static gint motion_notify_event( GtkWidget *widget, GdkEventMotion *event ) { int x, y; GdkModifierType state; if (event->is_hint) gdk_window_get_pointer (event->window, &x, &y, &state); else { x = event->x; y = event->y; state = event->state; } if (state & GDK_BUTTON1_MASK && pixmap != NULL) draw_brush (widget, x, y); //erase if (state & GDK_BUTTON3_MASK && pixmap != NULL) erase_brush (widget, x, y); return TRUE; } void draft_quit() { gtk_grab_remove(draft_win); gtk_widget_destroy(draft_win); } void draft_reset() { gtk_widget_set_size_request (GTK_WIDGET(drawing_area), 500, 400); } /* window of draftpaer */ void draftpaper_window() { GtkWidget *vbox,*hbox,*h_line; draft_win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (draft_win, "Draft Paper"); gtk_window_set_title(GTK_WINDOW(draft_win), "Draft Paper - left draw,right erase"); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (draft_win), vbox); gtk_widget_show (vbox); g_signal_connect (G_OBJECT (draft_win), "destroy", G_CALLBACK (draft_quit), NULL); /* 创建绘图区 */ drawing_area = gtk_drawing_area_new (); gtk_widget_set_size_request (GTK_WIDGET(drawing_area), 500, 400); gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); gtk_widget_show (drawing_area); /* 用于处理后端位图的信号 */ g_signal_connect (G_OBJECT (drawing_area), "expose_event", G_CALLBACK (expose_event), NULL); g_signal_connect (G_OBJECT (drawing_area),"configure_event", G_CALLBACK (configure_event), NULL); /* 事件信号 */ g_signal_connect (G_OBJECT (drawing_area), "motion_notify_event", G_CALLBACK (motion_notify_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "button_press_event", G_CALLBACK (button_press_event), NULL); gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); /* h_line */ h_line = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox),h_line,FALSE,FALSE,0); gtk_widget_show(h_line); /* 退出按钮 */ /* hbox */ hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); //reset button reset_button = create_img_button(PRE_DIR"icon/reset.png","Reset","Reset", draft_reset, reset_button); gtk_box_pack_start (GTK_BOX (hbox), reset_button, FALSE, FALSE, 0); gtk_widget_show (reset_button); //quit button quit_button = create_img_button(PRE_DIR"icon/exit.png","Quit","Quit", draft_quit, quit_button); gtk_box_pack_start (GTK_BOX (hbox), quit_button, FALSE, FALSE, 0); gtk_widget_show (quit_button); gtk_widget_show (draft_win); }