Página siguiente Página anterior Índice general

17. El widget EventBox

Algunos widget gtk no tienen asociada una ventana X, por lo que sólo pueden dibujar en la de su padre. Debido a esto, no pueden recibir ningún evento y si tienen un tamaño incorrecto, no se recortarán correctamente por lo que puede que se sobreescriban ciertas zonas, etc... Si necesita este tipo de widgets, el EventBox es para usted.

Cuando se ve por primera vez, el widget EventBox puede parecer completamente inútil. No dibuja nada en la pantalla y no responde a ningún evento. Sin embargo, tiene una utilidad - proporciona una ventana X para su widget hijo. Esto es importante ya que muchos widgets GTK no tienen una ventana X asociada. No tener una ventana X ahorra memoria y mejora el rendimiento, pero tiene sus desventajas. Un widget sin una ventana X no puede recibir eventos, y no realizará ningún recorte en sus contenidos. Aunque el nombre EventBox enfatiza su función de manejador de eventos, el widget también puede utilizarse para hacer los recortes. (Y más... ver el ejemplo más abajo.)

Para crear un nuevo widget EventBox, utilice:

GtkWidget *gtk_event_box_new( void );

Un widget hijo puede añadirse a su EventBox así:

gtk_container_add( GTK_CONTAINER(event_box), widget );

El siguiente ejemplo demuestra los dos usos de EventBox - se crea una etiqueta que se recorta dentro de una pequeña caja, y hace que una pulsación del ratón en la misma finalice el programa.

/* principio del ejemplo eventbox eventbox.c */

#include <gtk/gtk.h>

int 
main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *event_box;
    GtkWidget *label;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
    gtk_window_set_title (GTK_WINDOW (window), "Event Box");
    
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (gtk_exit), NULL);
    
    gtk_container_border_width (GTK_CONTAINER (window), 10);
    
    /* Crea un EventBox y lo añade a nuestra ventana superior */

    event_box = gtk_event_box_new ();
    gtk_container_add (GTK_CONTAINER(window), event_box);
    gtk_widget_show (event_box);
    
    /* Crea una larga etiqueta */
    
    label = gtk_label_new ("Click here to quit, quit, quit, quit, quit");
    gtk_container_add (GTK_CONTAINER (event_box), label);
    gtk_widget_show (label);
    
    /* La recortamos. */
    gtk_widget_set_usize (label, 110, 20);
    
    /* Y enlazamos una acción con la etiqueta */
    gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);
    gtk_signal_connect (GTK_OBJECT(event_box), "button_press_event",
                        GTK_SIGNAL_FUNC (gtk_exit), NULL);
    
    /* Otra cosa más que necesita una ventana X ... */
    
    gtk_widget_realize (event_box);
    gdk_window_set_cursor (event_box->window, gdk_cursor_new (GDK_HAND1));
    
    gtk_widget_show (window);
    
    gtk_main ();
    
    return 0;
}
/* fin del ejemplo */


Página siguiente Página anterior Índice general