Download document (10.35 MB) - Escuela Superior de Informática ...

Download document (10.35 MB) - Escuela Superior de Informática ... Download document (10.35 MB) - Escuela Superior de Informática ...

11.07.2015 Views

66 Capítulo 3. Antecedentes, Estado de la CuestiónGTK WIDGET( w i d g e t )GTK OBJECT ( o b j e c t )GTK SIGNAL FUNC ( f u n c t i o n )GTK CONTAINER( c o n t a i n e r )GTK WINDOW( window )GTK BOX( box )Todos los widgets derivan de la clase base GtkObject. Esto significa que siempre se puedeusar un widget como argumento de una función, que acepte un objeto, realizando la conversiónde tipo GTK OBJECT().3.3.3 Funciones y retrollamadasLas señales son necesarias en la programación de aplicaciones con interfaz gráfica deusuario, debido a que el programa deber ser capaz de responder a las acciones que el usuariorealice. Si se mueve el ratón, se presiona un botón de la misma, se escribe un texto o se cierrauna ventana, puede enviarse una señal a una función de retrollamada de la aplicación. Dichaseñal puede ser una de las que la aplicación necesite gestionar.GTK es un toolkit (conjunto de herramientas) gestionadas mediante eventos. Esto quieredecir que un programa GTK queda “dormido” en gtk main() hasta que se recibe un evento,momento en el cual el control es transferido a la función encargada de tratarlo.En una aplicación GTK+, se están generando señales continuamente, pero la mayoría deellas son ignoradas. Por ejemplo, si se toma como ejemplo un botón, la aplicación tiene unaserie de señales específicas del botón para cuando el usuario pulsa el botón del ratón, lo libera,hace clic con el ratón, lo mueve sobre el botón o cuando el ratón abandona el botón. Otroswidgets son similares al widget del botón, y comparten que sólo una minoría de las señalesson útiles para el desarrollado de aplicaciones, siendo la mayoría de las señales ignoradas.Cuando es necesario tratar una señal, hay que asignar una retrollamada y asociarla con unwidget. Los widgets pueden registrar retrollamadas y una misma retrollamada puede registrarseante múltiples widgets.

3.3. Toolkits para Interfaces Gráficas de Usuario 67Hay un conjunto de señales que todos los widgets heredan, como por ejemplo, destroyy hay señales que son específicas de cada widget, como por ejemplo, la señal toggled de unbotón de selección.Para que un determinado widget haga algo útil, habrá que crear el controlador que recojala señal enviada por dicho widget, y se encargue de llamar a la función apropiada. Para haceresto se usa la siguiente función:g i n t g t k s i g n a l c o n n e c t ( GtkObject ∗ o b j e c t , g c h a r ∗name ,G tkSignalFunc func , g p o i n t e r f u n c d a t a ) ;donde el primer argumento es el widget que emite la señal, el segundo el nombre de laseñal que se quiere capturar, el tercero es la función a la que se debe llamar cuando se capturala señal y el cuarto, los datos que queremos pasarle a dicha función.La función especificada en el tercer argumento se denomina retrollamada (función de respuestao callback) y debe tener la forma siguiente:void c a l l b a c k f u n c ( GtkWidget ∗ widget , g p o i n t e r c a l l b a c k d a t a ) ;donde el primer argumento es un puntero al widget que emitió la señal, y el segundo unpuntero a los datos que son pasados a la función. Estos datos son los que se le pasan a travésdel último argumento de la función gtk signal connect(). Otra llamada usada con el mismopropósito que la anterior es:g i n t g t k s i g n a l c o n n e c t o b j e c t ( GtkObject ∗ o b j e c t ,g c h a r ∗name ,G tkSignalFunc func ,GtkObject ∗ s l o t o b j e c t ) ;Esta función es igual a la anterior, salvo en el último argumento, que en este caso es unpuntero a GtkObject. En este caso la retrollamada deberá ser de la siguiente forma:void c a l l b a c k f u n c ( GtkObject ∗ o b j e c t ) ;

3.3. Toolkits para Interfaces Gráficas <strong>de</strong> Usuario 67Hay un conjunto <strong>de</strong> señales que todos los widgets heredan, como por ejemplo, <strong>de</strong>stroyy hay señales que son específicas <strong>de</strong> cada widget, como por ejemplo, la señal toggled <strong>de</strong> unbotón <strong>de</strong> selección.Para que un <strong>de</strong>terminado widget haga algo útil, habrá que crear el controlador que recojala señal enviada por dicho widget, y se encargue <strong>de</strong> llamar a la función apropiada. Para haceresto se usa la siguiente función:g i n t g t k s i g n a l c o n n e c t ( GtkObject ∗ o b j e c t , g c h a r ∗name ,G tkSignalFunc func , g p o i n t e r f u n c d a t a ) ;don<strong>de</strong> el primer argumento es el widget que emite la señal, el segundo el nombre <strong>de</strong> laseñal que se quiere capturar, el tercero es la función a la que se <strong>de</strong>be llamar cuando se capturala señal y el cuarto, los datos que queremos pasarle a dicha función.La función especificada en el tercer argumento se <strong>de</strong>nomina retrollamada (función <strong>de</strong> respuestao callback) y <strong>de</strong>be tener la forma siguiente:void c a l l b a c k f u n c ( GtkWidget ∗ widget , g p o i n t e r c a l l b a c k d a t a ) ;don<strong>de</strong> el primer argumento es un puntero al widget que emitió la señal, y el segundo unpuntero a los datos que son pasados a la función. Estos datos son los que se le pasan a través<strong>de</strong>l último argumento <strong>de</strong> la función gtk signal connect(). Otra llamada usada con el mismopropósito que la anterior es:g i n t g t k s i g n a l c o n n e c t o b j e c t ( GtkObject ∗ o b j e c t ,g c h a r ∗name ,G tkSignalFunc func ,GtkObject ∗ s l o t o b j e c t ) ;Esta función es igual a la anterior, salvo en el último argumento, que en este caso es unpuntero a GtkObject. En este caso la retrollamada <strong>de</strong>berá ser <strong>de</strong> la siguiente forma:void c a l l b a c k f u n c ( GtkObject ∗ o b j e c t ) ;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!