line.c

来自「这个只有90多行的源代码, 示意了在linux平台下, 开发图形程序的原理。由C」· C语言 代码 · 共 94 行

C
94
字号
#include <gtk/gtk.h>


GtkWidget *g_window;
GtkWidget *g_vbox;
GtkWidget *g_drawing;
GdkPixmap *g_pixmap;

int xx, yy;


static gint configure_event(GtkWidget *widget, GdkEventConfigure *event,gpointer data)
{
	if (g_pixmap == NULL)
	{
		g_pixmap = gdk_pixmap_new(widget->window,widget->allocation.width,widget->allocation.height,-1);
		gdk_draw_rectangle(g_pixmap,widget->style->white_gc,TRUE,0, 0,widget->allocation.width,widget->allocation.height);
	}
	
	return TRUE;
}

static gint 
button_press_event(GtkWidget *widget, GdkEventButton *event)
{
	if(event->button == 1 && g_pixmap != NULL)
		xx = event->x, yy = event->y;
	
	return TRUE;
}

static gint
button_release_event(GtkWidget *widget, GdkEventButton *event)
{
	if(event->button == 1 && g_pixmap != NULL)
	{
		gdk_draw_line(g_pixmap, g_window->style->black_gc, 
			xx, yy, event->x, event->y);
		GdkRectangle update_rect;
		update_rect.x = MIN(event->x, xx);
		update_rect.y = MIN(event->y, yy);
		update_rect.width = ABS(event->x - xx);
		update_rect.height = ABS(event->y - yy);
		gtk_widget_draw (g_drawing ,&update_rect);
	}
	return TRUE;
}

static gint 
expose_event(GtkWidget *widget, GdkEventExpose *event)
{
	gdk_draw_pixmap(widget->window,widget->style->fg_gc[GTK_WIDGET_STATE (widget)],g_pixmap,
		event->area.x, event->area.y,event->area.x, event->area.y,event->area.width, event->area.height);
	return FALSE;
}

GtkWidget* create_g_window1 (void)
{
	
	g_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_object_set_data (GTK_OBJECT (g_window), "g_window", g_window);
	gtk_window_set_title (GTK_WINDOW (g_window),"g_window");
	gtk_container_border_width(GTK_CONTAINER(g_window),2);
	gtk_signal_connect(GTK_OBJECT(g_window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
	
	g_vbox = gtk_vbox_new (FALSE, 0);
	gtk_widget_show (g_vbox);
	gtk_container_add (GTK_CONTAINER (g_window), g_vbox);	
	
	g_drawing = gtk_drawing_area_new();
	gtk_widget_set_events(g_drawing, GDK_EXPOSURE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_MOTION_MASK|GDK_SUBSTRUCTURE_MASK);
	gtk_signal_connect(GTK_OBJECT(g_drawing), "configure_event", GTK_SIGNAL_FUNC(configure_event), NULL);
	gtk_signal_connect(GTK_OBJECT(g_drawing), "button_press_event", GTK_SIGNAL_FUNC(button_press_event), NULL); 
	gtk_signal_connect(GTK_OBJECT(g_drawing), "button_release_event", GTK_SIGNAL_FUNC(button_release_event), NULL); 
	gtk_signal_connect(GTK_OBJECT(g_drawing), "expose_event", GTK_SIGNAL_FUNC(expose_event), NULL); 
	gtk_widget_set_usize(GTK_WIDGET(g_drawing), 300, 200);
	gtk_widget_show(g_drawing);
	gtk_box_pack_start(GTK_BOX(g_vbox),g_drawing,FALSE,TRUE,0);
	
	return g_window;
}

int main (int arg_gc, char *argv[])
{
	gtk_set_locale();
	gtk_init (&arg_gc,&argv);
	GtkWidget *g_window1;
	g_window1 = create_g_window1 ();
	gtk_widget_show (g_window1);
	gtk_main ();
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?