11.07.2015 Views

Ejemplo de desarrollo de una aplicación en GTK# - Willy .Net

Ejemplo de desarrollo de una aplicación en GTK# - Willy .Net

Ejemplo de desarrollo de una aplicación en GTK# - Willy .Net

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Ejemplo</strong> <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>una</strong> aplicación <strong>en</strong> <strong>GTK#</strong>Publicado Originalm<strong>en</strong>te <strong>en</strong> http://ultimaorbita.com/raciel/x-ezine/x1/1x004-gtksharp.htmlRoberto PérezMono-Hispano www.monohispano.org/hylian@jazzfree.com1. IntroduccionEste tutorial es <strong>una</strong> pequeña muestra <strong>de</strong> lo que po<strong>de</strong>mos hacer con gtk# y todo ello con muypoco esfuerzo. No pret<strong>en</strong><strong>de</strong> ser un estudio a fondo <strong>de</strong> la api ya que aun se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> estadoinicial, aunque totalm<strong>en</strong>te operativo. Para mas <strong>de</strong>talles ver la pagina <strong>de</strong> gtk# y ver la api <strong>de</strong> gtk+<strong>en</strong> www.gtk.org ya que es bastante similar pero con la facilidad que supone la programacionori<strong>en</strong>tada a objetos.Junto al tutorial se distribuye <strong>una</strong> pequeña aplicacion. Esta aplicacion es un conversor <strong>de</strong>medidas <strong>en</strong>tre los sistemas Metrico y Estado Uni<strong>de</strong>nse, asi pues po<strong>de</strong>mos convertir libras akilogramos o grados celsius a far<strong>en</strong>heit. La aplicacion no es un mo<strong>de</strong>lo <strong>de</strong> programacionori<strong>en</strong>teda a objetos su objetivo es simplem<strong>en</strong>te ver <strong>de</strong> <strong>una</strong> forma didactica como construir <strong>una</strong>interfaz gráfica <strong>de</strong> forma s<strong>en</strong>cilla. Asi pues la mejor forma <strong>de</strong> seguir el tutorial es haci<strong>en</strong>dose unejemplo s<strong>en</strong>cillo y vi<strong>en</strong>do el código <strong>de</strong> la aplicaciónSin mas vamos a por el tutorial :)2. Requerimi<strong>en</strong>tos para el <strong>de</strong>sarrolloPara po<strong>de</strong>r compilar y ejecutar necesitamos el compilador <strong>de</strong> mono y las librerias <strong>de</strong> gtk-sharp,que implica t<strong>en</strong>er las librerias gtk2.0 y sus <strong>de</strong>rivadas como glib2.0, etc. Para po<strong>de</strong>r instalarlo, <strong>en</strong><strong>de</strong>bian, lo mas facil sin t<strong>en</strong>er que acudir al CVS es instalarse los paquetes que resi<strong>de</strong>n <strong>en</strong> el sitio<strong>de</strong> alp toker para ello <strong>de</strong>bemos añadir a nuestro sources.list<strong>de</strong>b http://www.atoker.com/mono unstable mainY <strong>de</strong>spues# apt-get update# apt-get install mono gtk-sharp


Una vez realizado esto ya t<strong>en</strong>dremos mono y gtk-sharp <strong>en</strong> nuestro sistema asi que ya po<strong>de</strong>mosempezar a <strong>de</strong>sarrolar :)3. Como compilar y ejecutar las pruebasUna vez que hemos escrito nuestro codigo fu<strong>en</strong>te lo que queremos es compilarlo y probarlo asique para compilar nuestro codigo t<strong>en</strong>dremos que hacer# mcs -r gtk-sharp -r glib-sharp prueba.csSi<strong>en</strong>do prueba.cs el archivo con el codigo fu<strong>en</strong>te, los flags -r son para indicar al compilador queuse las librerias <strong>en</strong> la compilacion y linkado <strong>de</strong>l programa.Una vez t<strong>en</strong>emos el ejecutable nos lanzamos a ejecutarlo sin mas y el proceso es simple,po<strong>de</strong>mos usar el programa mono a lo mas puro estilo java o bi<strong>en</strong> po<strong>de</strong>mos darle permisos <strong>de</strong>ejecucion al fichero .exe creado y ejecutarlo como otro ejecutable mas, ya que para eso unmodulo <strong>de</strong>l kernel que se instala a la vez que instalamos mono se <strong>en</strong>cargara <strong>de</strong> que esto seafactible, por tanto usando mono pondremosmono prueba.exeY ejecutando directam<strong>en</strong>te el ficherochmod u+x prueba.exe./prueba.exeEsto es, primero le damos permisos <strong>de</strong> ejecucion y ejecutamos sin mas4. Como empezar con nuestra aplicacionPrimero empezaremos incluy<strong>en</strong>do las librerias que vamos a usar, <strong>en</strong> c# usamos using, quebuscando su semejante <strong>en</strong> otros l<strong>en</strong>guajes podria ser el #inclu<strong>de</strong> <strong>de</strong> C o el import <strong>de</strong> Java.Por tanto nuestras primeras lineas serianusing Gtk;using Gdk;using GtkSharp;using System;Ahora que ya t<strong>en</strong>emos las librerias "importadas" vamos a <strong>de</strong>finir la clase principal y el punto <strong>de</strong><strong>en</strong>trada al programa esto lo hacemos con:public class prueba{


public static int Main(string[] args){Con esto <strong>de</strong>finimos la clase principal llamada prueba, que a difer<strong>en</strong>cia <strong>de</strong> Java no ti<strong>en</strong>e por quellamarse como el archivo y tambi<strong>en</strong> <strong>de</strong>finimos la funcion principal que pue<strong>de</strong> ser void o int eso si<strong>de</strong>be ser static para que se pue<strong>de</strong> llamar <strong>de</strong>s<strong>de</strong> el motor <strong>de</strong> ejecucion. Ojo que la m <strong>de</strong> Main esmayuscula y el l<strong>en</strong>guaje es case-s<strong>en</strong>sitive :)5. Creaccion <strong>de</strong> <strong>una</strong> v<strong>en</strong>tana simpleLo primero que <strong>de</strong>bemos hacer es crear <strong>una</strong> v<strong>en</strong>tana don<strong>de</strong> vamos a poner nuestros objetos.Crear <strong>una</strong> v<strong>en</strong>tana es muy s<strong>en</strong>cillo, ya lo era usando gtk bajo C y aqui <strong>en</strong> C# todo es mass<strong>en</strong>cillo. Por tanto para crear la v<strong>en</strong>tana hacemosGtk.Window win = new Gtk.Window(Gtk.WindowType.Toplevel);win.Title = "Conversor <strong>de</strong> medidas";win.SetDefaultSize(300,300);Con la primera linea cremos el objeto v<strong>en</strong>tana, la v<strong>en</strong>tana sera <strong>de</strong>l tipo Toplevel ( estopermanece invariable <strong>de</strong> gtk+ ), con la segunda linea establecemos el atributo Title a la ca<strong>de</strong>na"Conversor <strong>de</strong> medidas", este atributo es el que luego se mostrara <strong>en</strong> la v<strong>en</strong>tana que creemos yfinalm<strong>en</strong>te <strong>en</strong> la tercera linea establecemos su tamaño por <strong>de</strong>fecto.Realm<strong>en</strong>te solo la primera linea es necesaria, pero es <strong>una</strong> pequeña muestra <strong>de</strong> lo que po<strong>de</strong>moshacer con la v<strong>en</strong>tana y la facilidad con que lo hacemos5.1. Añadi<strong>en</strong>do un callback a la v<strong>en</strong>tanaUna vez que t<strong>en</strong>emos la v<strong>en</strong>tana, t<strong>en</strong>emos que controlar que <strong>una</strong> vez que pulsemos el botoncerrar la v<strong>en</strong>tana se cierre limpiam<strong>en</strong>te y no t<strong>en</strong>gamos que finalizar el programa matando alproceso para ello añadimos un callback a la v<strong>en</strong>tana. Lo que <strong>en</strong> gtk+ haciamos con unsignal_connect aqui lo hacemos con Ev<strong>en</strong>tHandlers, la linea <strong>de</strong> codigo seriawin.DeleteEv<strong>en</strong>t += new Ev<strong>en</strong>tHandler (Window_Delete);Con esta linea lo que <strong>de</strong>cimos es que asocie el ev<strong>en</strong>to DeleteEv<strong>en</strong>t al controlador <strong>de</strong> ev<strong>en</strong>toscreado para la ocasion. Creamos el controlador <strong>de</strong> Ev<strong>en</strong>tos mediante el constructor al que lepasamos el nombre <strong>de</strong> <strong>una</strong> funcion <strong>de</strong> nuestro codigo que se va a <strong>en</strong>cargar <strong>de</strong> gestionar elev<strong>en</strong>to, <strong>en</strong> este caso Window_Delete.El uso <strong>de</strong>l operador += da a <strong>en</strong>t<strong>en</strong><strong>de</strong>r que po<strong>de</strong>mos t<strong>en</strong>er mas <strong>de</strong> un Ev<strong>en</strong>tHandler asociado aun ev<strong>en</strong>to <strong>de</strong> un objeto y por tanto po<strong>de</strong>mos "sumarlo" a los ya exist<strong>en</strong>tesEl codigo <strong>de</strong> la funcion Window_Delete seria:static void Window_Delete(object obj, Ev<strong>en</strong>tArgs args)


{}SignalArgs sa = (SignalArgs) args;Application.Quit();sa.RetVal = true;Con esta funcion que maneja el ev<strong>en</strong>to Delete <strong>de</strong> la v<strong>en</strong>tana, es <strong>de</strong>cir cuando la cerramos lo queestamos dici<strong>en</strong>do es que cierre la aplicacion y que el valor <strong>de</strong> retorno <strong>de</strong> esta sea true, indicandoque todo ha sido correcto. Los parametros <strong>de</strong> <strong>en</strong>trada <strong>de</strong> la funcion <strong>de</strong>b<strong>en</strong> ser esos ya quecuando se la llama internam<strong>en</strong>te <strong>de</strong>s<strong>de</strong> la aplicacion se le pasa estos datos a la funcion6. Creando nuestros primeros objetosEn este capitulo vamos a apr<strong>en</strong><strong>de</strong>r a crear objetos simples que luego añadiremos a nuestraaplicacion para crear la interfaz. Se pue<strong>de</strong>n crear muchos widgets pero aqui vamos a mostrarcomo crear alguno <strong>de</strong> ellos ya que la ori<strong>en</strong>tacion a objetos que ti<strong>en</strong>e gtk# lo hace muy s<strong>en</strong>cillo <strong>de</strong><strong>en</strong>t<strong>en</strong><strong>de</strong>r y vi<strong>en</strong>do como creamos <strong>una</strong> caja <strong>de</strong> texto seguro que sabemos como crear otroswidgets simplem<strong>en</strong>te mirando la API.6.1. Creando <strong>una</strong> caja <strong>de</strong> textoEl objeto que repres<strong>en</strong>ta <strong>una</strong> caja <strong>de</strong> texto recibe el mismo nombre que <strong>en</strong> gtk+, esto es, <strong>en</strong>trypor tanto crear <strong>una</strong> caja <strong>de</strong> texto sera tan s<strong>en</strong>cillo comoEntry caja_<strong>de</strong>_texto = new Entry();Con esta instruccion <strong>de</strong>claramos el objeto y lo construimos gracias a la llamada a new Entry().Una vez que t<strong>en</strong>emos el objeto po<strong>de</strong>mos acce<strong>de</strong>r y cambiar sus propieda<strong>de</strong>s como el texto queconti<strong>en</strong>e, su anchura o si se pue<strong>de</strong> editar o no. Para establecer las propieda<strong>de</strong>s nada mas facilque refer<strong>en</strong>ciarlas <strong>de</strong>s<strong>de</strong> el objeto y darles un valor, por tantocaja_<strong>de</strong>_texto.Text = "Hola mundo";caja_<strong>de</strong>_texto.Editable = false;caja_<strong>de</strong>_texto.MaxL<strong>en</strong>ght = 100;Console.WriteLine("{0}", caja_<strong>de</strong>_texto.Text);Como se ve <strong>en</strong> estas lineas cambiamos varias propieda<strong>de</strong>s <strong>de</strong>l objeto caja <strong>de</strong> texto y obt<strong>en</strong>emossu valor para sacarlo por pantalla6.2. Creando un botonAl igual que hemos creado la caja <strong>de</strong> texto, ahora vamos a crear un boton, el proceso esexactam<strong>en</strong>te el mismo, solo que cambiando <strong>de</strong> objeto; por tanto t<strong>en</strong>dremos


Button boton = new Button();Button boton2 = new Button("hola soy un boton");Hemos puesto dos ejemplos ya que hay dos posibilida<strong>de</strong>s <strong>de</strong> construir el boton, <strong>una</strong> <strong>de</strong> ellas espasandole la etiqueta o bi<strong>en</strong> sin pasarsela. Si no le pasamos la etiqueta que ti<strong>en</strong>e el boton, obi<strong>en</strong> si queremos cambiarla existe la propiedad 'Label' que conti<strong>en</strong>e el texto que se muestrasobre el boton. Asi por tanto dando un vistazo a sus propieda<strong>de</strong>s mas importantes t<strong>en</strong>emosboton.Click();boton.Label = "hola soy un boton";boton.Release();Como he dicho antes Label es la propiedad que conti<strong>en</strong>e el texto que se muestra sobre el boton,y tanto click como release son metodos <strong>de</strong>l objeto que hac<strong>en</strong> que g<strong>en</strong>ere los ev<strong>en</strong>tosrespectivos. En lo refer<strong>en</strong>te a los ev<strong>en</strong>tos lo trataremos <strong>en</strong> un capitulo aparte asi que <strong>de</strong>mom<strong>en</strong>to solo vamos a crear los objetos6.3. Creando <strong>una</strong> etiqueta <strong>de</strong> textoUna vez mas la creacion es muy s<strong>en</strong>cilla y para crear la etiqueta <strong>de</strong> texto usamosLabel mi_etiqueta = new Label("Hola esto es <strong>una</strong> etiqueta");La principal propiedad es Text que nos dice el texto que ti<strong>en</strong>e, al igual que po<strong>de</strong>mos cambiarlo7. Colocando los widgets <strong>en</strong> la aplicacionMuy bi<strong>en</strong> ahora t<strong>en</strong>emos todos los objetos que queramos, el sigui<strong>en</strong>te paso es colocarlos <strong>en</strong>nuestra aplicacion. No voy a <strong>en</strong>trar muy a fondo <strong>en</strong> todos los layouts que t<strong>en</strong>emos <strong>en</strong> gtk#, yaque son los mismos que <strong>en</strong> gtk+ y por tanto para compr<strong>en</strong><strong>de</strong>rlos <strong>en</strong> su totalidad es mejor mirar ladocum<strong>en</strong>tacion <strong>de</strong> gtk+, <strong>en</strong> este capitulo com<strong>en</strong>taremos los layouts <strong>de</strong> tipo table y <strong>de</strong> tipo vbox yhbox7.1. Creando nuestro layout <strong>de</strong> tipo tableEste widget nos creara <strong>una</strong> disposicion semejante a <strong>una</strong> tabla para colocar nuestros objetos<strong>de</strong>ntro <strong>de</strong> el, por tanto el primer paso es crear el widget <strong>en</strong> cuestionTable mi_tabla = new Table(6,3,false);Con esto creamos <strong>una</strong> tabla <strong>de</strong> 6 filas y 3 columnas, el ultimo parametro indica si las celdas vana ser homog<strong>en</strong>eas, <strong>en</strong> este caso lo establecemos a false. Una vez que hemos creado el objeto


vamos a introducir nuestros botones y cajas <strong>de</strong> texto <strong>de</strong>ntro <strong>de</strong> el; para ello vamos a usar elmetodo 'Attach' <strong>de</strong>l objeto, su uso es el sigui<strong>en</strong>temi_tabla.Attach(objeto, izq, <strong>de</strong>r, superior, inferior,opciones_<strong>en</strong>_x , opciones_<strong>en</strong>_y,padding_<strong>en</strong>_x, padding_<strong>en</strong>_y);Pasamos a explicar brevem<strong>en</strong>te que es cada parametro. El objeto es sin duda el objeto quequeremos insertar <strong>de</strong>ntro <strong>de</strong> la tabla. Los cuatro parametros izq, <strong>de</strong>r, superior e inferior nos van a<strong>de</strong>cir don<strong>de</strong> <strong>en</strong>cuadramos el objeto, cabe la posibilidad <strong>de</strong> plantearse por que usar 4 parametrosy no solo dos, la respuesta es s<strong>en</strong>cilla ya que po<strong>de</strong>mos t<strong>en</strong>er objetos q ocup<strong>en</strong> dos celdasjuntas, tres o siemplem<strong>en</strong>te <strong>una</strong> sola, asi que por tanto son necesario los 4 parametros. Por tantosi queremos colocar un objeto <strong>en</strong> la posicion 1,2 <strong>de</strong> la tabla los 4 parametros serian 1,2,2,3. Sidiera el caso que nuestro objeto t<strong>en</strong>dria que ext<strong>en</strong><strong>de</strong>rse <strong>de</strong>ntro <strong>de</strong> la fila 2 por las columnas 3,4 y5 los cuatro numeros serian 3,6,1,2.Los dos sigui<strong>en</strong>tes parametros son las opciones que tomaran los objetos que metamos <strong>en</strong> la olas celdas. Para establecer ambos parametros vamos a tomar el objeto AttachOptions, lasopciones posibles son Expand y Fill ambas son atributos <strong>de</strong> AttachOptions, se pue<strong>de</strong> poner mas<strong>de</strong> <strong>una</strong> opcion sumandolas con la operacion "|". Finalm<strong>en</strong>te los dos ultimos parametros son elespaciami<strong>en</strong>to que van a t<strong>en</strong>er los objetos <strong>en</strong> la celda que lo insertemos. Un ejemplo <strong>de</strong> estopodria sertabla.Attach(caja_<strong>de</strong>_texto, 2,3,2,3,AttachOptions.Expand | AttachOptions.Fill,AttachOptions.Fill, 0 , 0);Las tablas son un objeto muy practico para colocar nuestros objetos ya que <strong>de</strong>ntro <strong>de</strong> ellas nospermit<strong>en</strong> meter otros objetos como pue<strong>de</strong>n ser otros widgets <strong>de</strong> disposicion ( como boxes ) oincluso otras tablas, para mas informacion mirar la docum<strong>en</strong>tacion <strong>de</strong> gtk <strong>en</strong> www.gtk.org7.2. Creando layouts <strong>de</strong> tipo boxesEn estos tipos <strong>de</strong> layouts vamos a colocar los objetos <strong>de</strong> forma seguida, ya sea <strong>en</strong> disposicionvertical como <strong>en</strong> disposicion horizontal, asi que basicam<strong>en</strong>te lo que t<strong>en</strong>emos que controlar es siqueremos colocarlo por el final o por el principio. Por tanto t<strong>en</strong>emos dos tipos <strong>de</strong> boxes,horizontales y verticales7.2.1. Horizontal Boxes ( HBox )En este widget vamos a insertar los objetos sigui<strong>en</strong>do <strong>una</strong> disposicion horizontal, para elloprimero t<strong>en</strong>emos que crear el objeto HBox <strong>de</strong> la sigui<strong>en</strong>te formaGtk.HBox disp_horiz = new Gtk.HBox(false, 10)


Don<strong>de</strong> el primer parametro indica si nuetros widgets van a ser colocados <strong>de</strong> forma homog<strong>en</strong>ea,es <strong>de</strong>cir que todos ocup<strong>en</strong> lo mismo. El segundo parametro indica el espaciado que vamos a<strong>de</strong>jar <strong>en</strong>tre los objetos que coloquemos.Una vez que t<strong>en</strong>emos el objeto creado ya nos disponemos a introducir nuestros widgets <strong>de</strong>ntro<strong>de</strong> el, para ello fundam<strong>en</strong>talm<strong>en</strong>te vamos a usar dos metodos, PackStart y PackEnd. Veamos unejemplo <strong>de</strong> ellosdisp_horiz.PackStart( objeto, expand, fill, padding )disp_horiz.PackEnd( objeto, expand, fill, padding )Como vemos los parametros son similares asi que pasamos a explicarlos, el primero es el objetoque queremos insertar. El segundo parametro es si nuestro objeto va o no a ocupar todo elespacio restante <strong>de</strong>ntro <strong>de</strong> nuestro widget box. El sigui<strong>en</strong>te parametro ( fill ) controla si el espacioextra <strong>de</strong>l box, va a ser rell<strong>en</strong>ado con nuestro objeto o bi<strong>en</strong> se va a utilizar como padding.Finalm<strong>en</strong>te el ultimo parametro establece el espaciado que se va a <strong>de</strong>jar <strong>en</strong>tre el objeto qestamos "empaquetando" y el sigui<strong>en</strong>te objeto.Una vez visto como introducimos objetos <strong>de</strong>ntro <strong>de</strong>l widget vamos a analizar la difer<strong>en</strong>cia <strong>en</strong>trePackStart y PackEnd. El primero, PackStart, introduce los objetos <strong>de</strong> izquierda a <strong>de</strong>recha <strong>de</strong>ntro<strong>de</strong>l widget mi<strong>en</strong>tras que el segundo, PackEnd, es lo contrario; <strong>de</strong> <strong>de</strong>recha a izquierda.Otros metodos importantes <strong>de</strong>l objeto HBox pue<strong>de</strong>n ser:• disp_horiz.PackEndDefaults(objeto). Introduce el objeto empezando por la <strong>de</strong>recha peroel resto <strong>de</strong> valores los toma por <strong>de</strong>fecto• disp_horiz.PackStartDefaults(objeto). Igual que el anterior solo que esta vezempaquetamos <strong>de</strong> izquierda a <strong>de</strong>recha• disp_horiz.Reor<strong>de</strong>rChild(objeto, posicion). Reor<strong>de</strong>na un objeto <strong>de</strong>ntro <strong>de</strong>l layout7.2.2. Vertical Box ( VBox )Realm<strong>en</strong>te este widget es un clon <strong>de</strong>l anterior pero como se pue<strong>de</strong> suponer difer<strong>en</strong>te a la hora<strong>de</strong> empaquetar objetos. Su creacion es similar, por tantoGtk.VBox disp_vert = new VBox(true, 10);Como antes el primer parametro indica si la disposicion va a ser homog<strong>en</strong>ea y el segundo elespaciado <strong>en</strong>tre objetos insertados. Los principales metodos como antes van a ser PackStart yPackEnd, los cuales t<strong>en</strong>dran los mismos parametros. La difer<strong>en</strong>cia es que con el metodoPackStart los objetos se insertaran <strong>de</strong> arriba a abajo y usando PackEnd los objetos se insertarancom<strong>en</strong>zando por el limite inferior hasta el superior. Un ejemplo <strong>de</strong> codigo <strong>de</strong> todo esto pue<strong>de</strong> ser:disp_vert.PackStart(boton, true, false, 10);disp_vert.PackEnd(caja_texto, false, false, 0);Los metodos a <strong>de</strong>stacar son i<strong>de</strong>nticos al caso anterior ya que ambos boxes <strong>de</strong>rivan <strong>de</strong> la claseBox que es la que aporta esos metodos.


8. Conectando los ev<strong>en</strong>tosMuy bi<strong>en</strong> ahora ya t<strong>en</strong>emos nuestros botones y etiquetas y todo creado y ¿ahora que? pulso <strong>en</strong>un boton pero no sale nada. Aqui es don<strong>de</strong> <strong>en</strong>tra <strong>en</strong> juego este capitulo. Cada objeto ti<strong>en</strong>e unosev<strong>en</strong>tos pre<strong>de</strong>terminados, como por ejemplo un boton ti<strong>en</strong>e el ev<strong>en</strong>to Clicked que se lanzacuando se pulsa. En el capitulo no nos vamos a c<strong>en</strong>trar <strong>en</strong> profundidad <strong>en</strong> los ev<strong>en</strong>tos ya que esun tema amplio <strong>de</strong>ntro <strong>de</strong> gtk# pero si seremos capaces <strong>de</strong> hacer cosas cuando se produce elev<strong>en</strong>to.La conexion <strong>de</strong> ev<strong>en</strong>tos <strong>en</strong> gtk# es similar a lo que haciamos <strong>en</strong> gtk+ con las funcionessignal_connect. Veamos un ejemplo <strong>de</strong> codigo <strong>en</strong> gtk#boton.Clicked += new Ev<strong>en</strong>tHandler (boton_pulsado);Con esta linea <strong>de</strong> código lo que hacemos es ligar el ev<strong>en</strong>to Clicked <strong>de</strong>l objeto boton a unmanejador <strong>de</strong> ev<strong>en</strong>tos. Este manejador lo creamos para la ocasion y el constructor recibe comoparametro la funcion que se va a <strong>en</strong>cargar <strong>de</strong> gestionar el ev<strong>en</strong>toAl igual que <strong>en</strong> el capitulo que creabamos la v<strong>en</strong>tana aqui usamos el operador "+=" parasignificar que po<strong>de</strong>mos añadir mas <strong>de</strong> un controlador para un ev<strong>en</strong>to pre<strong>de</strong>terminado9. Introduci<strong>en</strong>do <strong>una</strong> s<strong>en</strong>cilla barra <strong>de</strong> m<strong>en</strong>u9.1. Los principales objetos que <strong>en</strong>tran <strong>en</strong> juegoPara crear nuestra barra <strong>de</strong> m<strong>en</strong>u vamos a usar principalm<strong>en</strong>te 3 objetos, estos son: M<strong>en</strong>u,M<strong>en</strong>uBar y M<strong>en</strong>uItem. Como se pue<strong>de</strong> <strong>de</strong>ducir M<strong>en</strong>uBar es el objeto que <strong>de</strong>fine la Barra <strong>en</strong> si; elobjeto M<strong>en</strong>u es el que repres<strong>en</strong>ta los difer<strong>en</strong>tes m<strong>en</strong>us que pue<strong>de</strong> haber <strong>de</strong>ntro <strong>de</strong> la barra (Archivo, Edicion... ) y finalm<strong>en</strong>te M<strong>en</strong>uItem son las opciones que hay <strong>de</strong>ntro <strong>de</strong> los m<strong>en</strong>us9.2. Creando la barra <strong>de</strong> m<strong>en</strong>uUna vez compr<strong>en</strong>dido el uso <strong>de</strong> los tres objetos parece facil crear <strong>una</strong> barra <strong>de</strong> m<strong>en</strong>us; por tantoel primer paso <strong>de</strong>be ser crear la propia barra <strong>de</strong> m<strong>en</strong>uM<strong>en</strong>uBar m<strong>en</strong>u = new M<strong>en</strong>uBar();Bi<strong>en</strong>, ya t<strong>en</strong>emos la barra <strong>de</strong> m<strong>en</strong>u creada, ahora vamos a crear el m<strong>en</strong>u "File"M<strong>en</strong>u m<strong>en</strong>u_file = new M<strong>en</strong>u()M<strong>en</strong>uItem file_item = new M<strong>en</strong>uItem("_File");


Con estas dos llamadas hemos creado el m<strong>en</strong>u y el item que va a ser el que nosotros veamosyque va a poner, como queda claro, "File". El sigui<strong>en</strong>te paso es <strong>de</strong>cirle al m<strong>en</strong>u que use el Itemm<strong>en</strong>u para su repres<strong>en</strong>tacion; para ellofile_item.Subm<strong>en</strong>u = m<strong>en</strong>u_file;Ya t<strong>en</strong>emos creado el item, ahora el sigui<strong>en</strong>te paso es crear todo lo que vayamos a meter <strong>de</strong>ntro<strong>de</strong>l m<strong>en</strong>u "File", para el ejemplo vamos a insertar el Item "exit", por tanto necesitamos crear unobjeto <strong>de</strong> tipo M<strong>en</strong>uItem e insertarlo <strong>de</strong>ntro <strong>de</strong>l m<strong>en</strong>u "File"M<strong>en</strong>uItem exit_item = new M<strong>en</strong>uItem("exit");m<strong>en</strong>u_file.App<strong>en</strong>d(exit_item);Con estas dos s<strong>en</strong>t<strong>en</strong>cias ya t<strong>en</strong>emos nuestro m<strong>en</strong>u "File" creado, ahora el sigui<strong>en</strong>te paso esañadirlo a la barra <strong>de</strong> m<strong>en</strong>u, lo que hacemos conm<strong>en</strong>u.App<strong>en</strong>d(file_item);Ahora <strong>de</strong>bemos añadir el callback para el Item exit, para que cuando pulsemos sobre el, serealize alg<strong>una</strong> opcion; <strong>en</strong> ese caso salir <strong>de</strong> la aplicacion. Para elloexit_item.Activated += new Ev<strong>en</strong>tHandler(exit_func);Como se ve, para hacer esto lo unico que t<strong>en</strong>emos que hacer es indicar que el ev<strong>en</strong>to Activatedse controle con el Ev<strong>en</strong>tHandler que creamos <strong>en</strong> esta s<strong>en</strong>t<strong>en</strong>cia; lo que realm<strong>en</strong>te hace es llamara la funcion exit_func.9.3. FinalizandoAhora ya t<strong>en</strong>emos creado el m<strong>en</strong>u incluidos los controladores <strong>de</strong> ev<strong>en</strong>tos, el ultimo paso consiste<strong>en</strong> incluirlo <strong>en</strong> la v<strong>en</strong>tana, para ello <strong>de</strong>bemos empaquetarlo como si fuera un boton, <strong>una</strong> caja <strong>de</strong>texto o cualquier otro widget; por ejemplo si usaramos un vbox para empaquetar los widgets <strong>de</strong>la v<strong>en</strong>tana pondriamosVBOX.PackStart(m<strong>en</strong>u, false, false, 0 );10. ConclusionesComo se pue<strong>de</strong> ver gtk# mejora gtk+ <strong>en</strong> la facilidad <strong>de</strong> uso. Dada la ori<strong>en</strong>tacion a objetos qu<strong>en</strong>os ofrece gtk#, todo es bastante mas s<strong>en</strong>cillo y conceptualm<strong>en</strong>te mas compr<strong>en</strong>sible. Se pue<strong>de</strong><strong>de</strong>cir que es mucho mas facil programar con gtk# que con gtk+, aunque no convi<strong>en</strong>e olvidarse <strong>de</strong>gtk+ ya que gtk# esta construido a partir <strong>de</strong> este y por lo tanto la api y la forma <strong>de</strong> uso es similar


La creacion <strong>de</strong> interfaces graficas con esta nueva variante es s<strong>en</strong>cilla, pero sigue si<strong>en</strong>do tediosa,para ello esta libgla<strong>de</strong> que se <strong>en</strong>carga <strong>de</strong> importar las interfaces creadas con gla<strong>de</strong> <strong>de</strong>ntro <strong>de</strong>nuestro programaComo se ha visto el tutorial no cubre los aspectos mas complejos <strong>de</strong> gtk, <strong>de</strong> hecho tampoco eraese el objetivo. Con el tutorial se pret<strong>en</strong>dia dar <strong>una</strong> vision introductoria al <strong>de</strong>sarrollo <strong>de</strong>aplicaciones con gtk# y se ha tratado <strong>de</strong> hacer ver la integracion <strong>en</strong>tre las dos APIs, comocomplem<strong>en</strong>to al tutorial se distribuye <strong>una</strong> aplicacion que funciona como conversor <strong>de</strong> medidas.La po<strong>de</strong>is <strong>en</strong>contrar aqui http://mono.es.gnome.org/tutoriales/gtksharp/co<strong>de</strong>/conversor.cs

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

Saved successfully!

Ooh no, something went wrong!