GTK+ Forums Forum Index GTK+ Forums
Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Reseting drawing_area

 
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming
Author Message
javigis
Familiar Face


Joined: 18 May 2007
Posts: 8

PostPosted: Fri May 18, 2007 5:00 pm    Post subject: Reseting drawing_area Reply with quote

I´ve been madifyng(sorry about my english) the Scrible example Gtk and I have a question:is there any form to reset(clear) the drawing_area?This is the code that I´ve done(it´s poor):

#include <stdlib.h>
#include <gtk/gtk.h>
/* Backing pixmap for drawing area */
static GdkPixmap *pixmap = NULL;



GtkWidget *drawing_area;
GdkFont *font;

/* Create a new backing pixmap of the appropriate size */
static gint configure_event( GtkWidget *widget,
GdkEventConfigure *event )
{
if (pixmap)
gdk_pixmap_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);

//pinto escalas
gdk_draw_line(pixmap,drawing_area->style->black_gc,10,190,390,190);
gdk_draw_line(pixmap,drawing_area->style->black_gc,190,10,190,390);

font=gdk_font_load("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*");

//Se pinta la
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,200,10,"Vdelante");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,200,390,"Vatras");
//Se pinta la
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,10,200,"Wantihorario");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,345,200,"Whorario");
return TRUE;
}
/* Redraw the screen from the backing pixmap */
static gint expose_event( GtkWidget *widget,
GdkEventExpose *event )
{
gdk_draw_pixmap(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 - 1.5;
update_rect.y = y - 1.5;
update_rect.width = 3;
update_rect.height = 3;
gdk_draw_rectangle (pixmap,
widget->style->black_gc,
TRUE,
update_rect.x, update_rect.y,
update_rect.width, update_rect.height);
gtk_widget_draw (widget, &update_rect);

gdk_draw_line(pixmap,drawing_area->style->black_gc,10,190,390,190);
gdk_draw_line(pixmap,drawing_area->style->black_gc,190,10,190,390);

font=gdk_font_load("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*");

//Se pinta la
gdk_draw_string(pixmap,font,widget->style->black_gc,200,10,"Vdelante");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,200,390,"Vatras");
//Se pinta la
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,10,200,"Wantihorario");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,345,200,"Whorario");
}
static gint button_press_event( GtkWidget *widget,
GdkEventButton *event )
{
if (event->button == 1 && pixmap != NULL)
draw_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);

return TRUE;
}

/**** salgo de la aplicaion***/
gint delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
gtk_main_quit ();
return(FALSE);
}
void quit ()
{
gtk_exit (0);
}
void limpiardraw ( GtkWidget *widget, GdkEventExpose *event )
{
/******** aqui limpio el drawing_area*****************/
gdk_window_clear(drawing_area->window);
/* if (pixmap)
gdk_pixmap_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);*/

//pinto escalas
gdk_draw_line(pixmap,drawing_area->style->black_gc,10,190,390,190);
gdk_draw_line(pixmap,drawing_area->style->black_gc,190,10,190,390);

font=gdk_font_load("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*");

//Se pinta la
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,200,10,"Vdelante");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,200,390,"Vatras");
//Se pinta la
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,10,200,"Wantihorario");
gdk_draw_string(pixmap,font,drawing_area->style->black_gc,345,200,"Whorario");
}
int main( int argc,
char *argv[] )
{
GtkWidget *Teleoperacion;
GtkWidget *vbox;
GtkWidget *button;
GtkWidget *limpiar;


/*
GtkWidget *button;
GtkWidget *limpiar;*/

gtk_init (&argc, &argv);

Teleoperacion = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize(Teleoperacion,410,410);
gtk_widget_set_name (GTK_WIDGET(Teleoperacion), "Teleoperacion");

vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (Teleoperacion), vbox);
gtk_widget_show (vbox);
/* Crear el drawing area */

drawing_area = gtk_drawing_area_new ();
gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area), 200, 200);
gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);

gtk_widget_show (drawing_area);
/* Señales del pixmap*/

gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
(GtkSignalFunc) expose_event, NULL);
gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
(GtkSignalFunc) configure_event, NULL);
/* Event signals */

gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event",
(GtkSignalFunc) motion_notify_event, NULL);
gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event",
(GtkSignalFunc) 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);


/******* conecto las señales ****************/
gtk_signal_connect (GTK_OBJECT (Teleoperacion), "delete_event",
GTK_SIGNAL_FUNC (delete_event), NULL);

/* .. boton de limpiar */
limpiar=gtk_button_new_with_label ("Limpiar");
gtk_box_pack_start (GTK_BOX (vbox), limpiar, FALSE, FALSE, 0);
// le conecto para destruir la aplicacion
gtk_signal_connect_object (GTK_OBJECT (limpiar), "clicked",
GTK_SIGNAL_FUNC (limpiardraw),
NULL);
/* .. boton de salir */
button = gtk_button_new_with_label ("Quit");
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
// le conecto para destruir la aplicacion
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (quit),
GTK_OBJECT (Teleoperacion));
gtk_widget_show (limpiar);
gtk_widget_show (button);


gtk_widget_show (Teleoperacion);

gtk_main ();

return 0;
}


I want to clear the drawing_area but not clear the lines(the scales)
Thanks
javigis

PD: limpiar=clear
Back to top
javigis
Familiar Face


Joined: 18 May 2007
Posts: 8

PostPosted: Sat May 19, 2007 4:40 pm    Post subject: Reply with quote

Please, can respond somebody to me?
I only need to reset the drawing_area, but keeping the line scales.
Thanks
Back to top
deusvede
Familiar Face


Joined: 13 Feb 2007
Posts: 29
Location: Madrid, Spain

PostPosted: Sat May 19, 2007 8:13 pm    Post subject: Reply with quote

[Spanish] Crea una segunda drawing_area en blanco, dibuja en ella las líneas de escala, e intercámbiala por la primera. Así limpias la drawing_area sin que haya parpadeo ni se vea el redibujado.

[English] Create a second drawing_area, draw on it the scale lines and swap it with the first one. That way, you can clean the drawing_area with no flicker nor redraw effects.
Back to top
javigis
Familiar Face


Joined: 18 May 2007
Posts: 8

PostPosted: Sun May 20, 2007 3:18 pm    Post subject: Reply with quote

[Spanish]Gracias por responder paisano.Como intercambio esas drawing_area?Las intercambio en expose_event?
[English]Thanks to respond countryman. How interchange those drawing_area? Them interchange in expose_event?

Gracias de uevo por responder
Back to top
Display posts from previous:   
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming All times are GMT
Page 1 of 1

 


Powered by phpBB © 2001, 2005 phpBB Group
CodeBB 1.0 Beta 2
Protected by Anti-Spam ACP