Aplicaciones con GUI en .NET: ¿Gtk# o Windows Forms?

Hace tiempo discutía con algunas personas la mejor manera de usar Mono tanto en el escritorio Linux como en Windows. Me refiero al momento de escoger entre Windows Forms y Gtk#, para desarrollar aplicaciones con interfaz gráfica. Personalmente pienso que la mejor opción es, inclinándome hacia el lado del software libre, usar Mono + Gtk#. Claro, eso también depende de tus gustos como desarrollador y, más importante aún, de las necesidades del proyecto a realizar.
Lo que quiero enseñarles en esta entrada es cómo se pueden tomar diferentes caminos, y aclarar algunas dudas que me han planteado ciertos lectores. Siendo así, vamos a tomar como ejemplo a dos programas sencillos: el primero usando Gtk# y corriendo tanto en Linux como Windows, y el otro usando Windows Forms corriendo tanto en Windows como Linux.
Desarrollando y ejecutando aplicaciones Gtk# y Windows Forms usando Mono
Antes de comenzar con los ejercicios, veamos qué necesitamos para desarrollar y ejecutar aplicaciones que usen Gtk# y Windows Forms. Es necesario (obviamente) tener dicho framework instalado; afortunadamente, la mayoría de las distribuciones Gnu/Linux actuales tienen los paquetes necesarios en los repositorios, e incluso vienen con lo necesario para ejecutar aplicaciones desarrolladas con Mono (como Tomboy, Fspot o Banshee). Para compilar aplicaciones C# para mono es necesario utilizar el CSharp Compiler (cms).
También, es posible descargar mono para los más importantes sistemas operativos, incluyendo por supuesto sistemas Microsoft Windows. Para tal caso es posible descargar una versión completa (Mono + Gtk# + XSP), o tan solo el intérprete + Gtk# para un Framework .NET ya instalado sobre el ordenador.
Código del programa que usa Gtk#
//Ejemplo GTK (EjemploGtk.cs)
using Gtk;
using System;
class EjemploGtk {
static void Main()
{
Application.Init ();
//Crear el boton
Button btn = new Button (“Hola monito!”);
//Asignar un evento al evento Clic del boton
btn.Clicked += new EventHandler (hola);
//Crear el objeto ventana
Window ventana = new Window (“Lindo primate!”);
//Asignar un metodo al evento Cerrar ventan
ventana.DeleteEvent += new DeleteEventHandler (cerrar_ventana);
//Asigna el ancho y alto de la ventana
ventana.DefaultWidth = 200;
ventana.DefaultHeight = 60;
//Anyadir el boton a la ventana
ventana.Add (btn);
//Mostrar la ventana
ventana.ShowAll ();
//Ejecutar la aplicacion
Application.Run ();
}
static void cerrar_ventana (object obj, DeleteEventArgs args)
{
Application.Quit ();
}
static void hola (object obj, EventArgs args)
{
Console.WriteLine(“Lindo monito!”);
Application.Quit ();
}
}
Para compilarlo y ejecutarlo puedes usar los siguientes comandos:
mcs -pkg:gtk-sharp-2.0 EjemploGtk.cs
mono EjemploGtk.exe
El resultado es el mismo tanto en Linux como en Windows:

Código del programa que usa Windows Forms
Este programa hace exactamente lo mismo que el anterior, pero esta vez usando Windows Forms para la interfaz gráfica:
//Ejemplo Windows Forms (EjemploWinForms.cs)
using System.Drawing;
using System.Windows.Forms;
using System;
class EjemploWinForms : Form{
static void Main(){
Application.Run(new EjemploWinForms());
}
public EjemploWinForms() {
//Crear e iniciar el boton, y sus propiedades
Button boton = new Button();
boton.Location = new Point(0, -1);
boton.Name = “boton”;
boton.Size = new System.Drawing.Size(193, 60);
boton.TabIndex = 0;
boton.Text = “Botoncito”;
//Asignar un evento al evento Clic del boton
boton.Click += new System.EventHandler(hola);
//Indicar el tamanyo de la ventana
ClientSize = new System.Drawing.Size(193, 60);
//Anyadir el boton
Controls.Add(boton);
Text = “Ventanita”;
ResumeLayout(false);
}
private void hola(object sender, EventArgs e) {
Console.WriteLine(“Un mensajito!”);
Close ();
}
}
Para compilarlo y ejecutarlo puedes usar los siguientes comandos:
mcs -r:System.Drawing.dll,System.Windows.Forms.dll EjemploWinForms.cs
mono EjemploWindowsForms.exe
El resultado es el mismo tanto en Linux como en Windows:

Consideraciones a tener en cuenta
Al momento de desarrollar aplicaciones con GUIs en C# de manera rápida, tenemos basicamente dos opciones:
- Podemos usar Monodevelop que incluye un editor de interfaces gráficas basado en Stetic y que por supuesto desarrolla dichas interfaces bajo Gtk#.
- O usar el editor de interfaces de Microsoft Visual Studio que, aunque no es libre, he de reconocer que es bastante bueno y completo. En este caso las aplicaciones correrían usando Windows Forms.
Por supuesto, si deseamos usar Mono como plataforma de desarrollo no vale la pena usar herramientas Microsoft. De hecho, opino que el framework de Mono incluye librerías para ejecutar aplicaciones que usen Windows Forms, no con el fin de desarrollar aplicaciones que usen dichas librerías, sino para facilitar la migración de proyectos existentes hacia Mono.
Enlaces interesantes
Descargar código fuente de los ejemplos
48 Comentarios | deja el tuyo





Dice básicamente que no encuentra la librería gdiplus.dll. ¿Estás en Linux o en Windows? Que tal si buscas esa librería a ver si está
Un saludo.
hola que tal . yo se que no es el momento pero quisiera konocer amigos
no importa edad, sexo, ni de donde sean
me llamo carlos
tengo 16 años
y soy de san fernando temaulipas…
les aseguro que no se van a arepentyr de habermne conocido…
se los aseguro 100%
hola
hola que tal . yo se que no es el momento pero quisiera konocer amigos
no importa edad, sexo, ni de donde sean
me llamo carlos
tengo 16 años
y soy de san fernando temaulipas…
les aseguro que no se van a arepentyr de habermne conocido…
se los aseguro 100%
mi correo es :arcangel-c-j@hotmail.com
hola! por que no me acepta lo sig?
using system.Windows……
Que debo de instalar?
Gracias
Hola Jesus…
Fíjate en el uso de mayúsculas y minúsculas.
Un saludo!
No entiendo por que dices que Windows Forms no vale la pena usarlo por que no es libre. Debes saber que Mono ha implementado su propia versión de Windows Forms y es libre como todo el Framework.
Fácil: Windows Forms sólo funciona en Windows, y uno de los principales propósitos del proyecto Mono es llevar C# a otras plataformas.
Revisen la aplicacion SESHAT esta en Mono+GTK+PostgreSQL
Sistema de Facturacion y Punto de Venta
http://sourceforge.net/projects/seshat-fact-pv/
Probada en Windows y Linux
Me parece que estás perdido. Programas una aplicación con Windows Forms de Mono y hablas de Microsoft. El windows forms que viene con mono es de mono y de nadie más, y por lo tanto es libre.
Deberías fundamentarte un poco más para dar un concepto.
Creo que primero debemos leer con detenimiento, creo que lo que el se refiere es promover el desarrollo con GTK debido a que la concepcion de Windows Forms no es ser libre, y que Mono no lo desarrolla para promoverlo si no para ofrecer una pasarela mas facil a la hora de migrar aplicaciones a el.
necesito crear unas ventanas en c# con monodevelop el programa tiene que correr al inicio una ventana que contenga una imagen mi nombre y el nombre de mi proyecto despues tiene que aparecer otra ventana con un menu ese menu debe tener archivo y acerca de en el menu archivo se tiene que desplegar nuevo contacto, checar contactos y salir en nuevo contacto aparecera una ventana en donde pueda ingresar nombre direccion y telefono y al final apreceran 2 botones que diran guardar y salir en el menu checar contactos apareceran todos los contactos guardados y al final habra un boton que diga salir y en el munu salir obtendremos una salida completa del programa,,y en el menu a cerca de aparecerera una ventana que muestre “Programa creado por: y mi nombre” al igual con una imagen y la fecha en que se creo el proyecto..
Me urge…..Si puedes ayudarme te lo agradecere la verdad esq de este programa depende que siga estudiando..xfa a mas tardar lo necesito mañana
si requieren ayuda en mono, llevo un par de años probandolo.
Saludos y no duden en preguntar
Me parece que el artículo es muy injusto con respecto a Windows Forms porque se muestra un código que es más “complejo” que el que se muestra para GTK#, siendo que lo mismo se podía haber logrado de la misma manera. Da la impresión de que el código está escrito deliberadamente de esa manera ya que se agregan propiedades (como el tabindex) que no se especifica en el primer listado y que tampoco son esenciales para Windows Forms. Además que se podía haber logrado que el botón ocupe todo el formulario seteando su propiedad “Dock” en “Fill”. Sin embargo, reconozco que es un buen detalle el constructor que especifica el texto tanto de la ventana como del botón.
Compa y como hago par utilizarlo en visual basic, puesto que ahi esta es paar C·
Mijo tienes que cambiarte a un lenguaje de programación de verdad. El soporte para Visual Basic es limitado en Mono ya que el nuevo favorito de MS es C#. Visual Basic .NET se creó no más para los que se quedaron en la época de VB6. En cuanto aprendí a programar en C# prometí jamás volver a Basic y creo que es la mejor decisión que he hecho.
Amén!
¿Lenguaje de programación de verdad? ¿Y el mismo creador del blog confirmando eso?
Increíble de verdad, ¿Qué es para ustedes un “lenguaje de verdad”? Tengo colegas que han hecho sistemas tan complejos que por eso pregunto. Honestamente es Marketing de Microsoft, creo C# para atraer a los que programamos en Java y VB para la gente de VB6, pero jamás aseguraría algo tan atroz como Alexei Humeiy y Cristian.
Ya a estas alturas deben saber que el código generado por ambos lenguajes es el mismo, y en todas las conferencias y en los TechNet WebCasts de Microsoft en su vida han dicho eso, más seriedad señores. Desinforman a la gente con aberraciones como esa sólo por alguna idea subjetiva y nada fundamentada.
Y aclaro, programo en C#, pero no desprecio a VB. Saludos,
Cuando hablo de “lenguaje de verdad” me refiero a eso: el lenguaje. Estamos claro que en el fondo cualquier lenguaje que cumpla con la CLS funcionará en .NET y se genera el mismo MSIL. A lo que voy es a las características del lenguaje en sí. Personalmente, encuentro que VB es muy “verbose” para mi gusto. Encuentro más rápido abrir y cerrar una llave que escribir “end {algo}” al final -Me hace sentir como cuando uno ve esos programas que hacen ahora para niños chicos donde te hacen preguntas y a uno le parece tan obvia la respuesta que es desesperante el tiempo que dan para responder-. Además que me gusta que sea estricto con los tipos desde el principio.
VB,NET es un lenguaje de transición, transición desde VB6 a .NET. Como dije anteriormente, casi todos los ejemplos están para C# y me aventuro a decir que en algún punto MS decidirá abandonar VB.NET, así que mientras más temprano uno se adapta, mejor.
Finalizando, el lenguaje no hace al profesional. Yo cuando he tenido que programar en VB trato de ser tan ordenado como lo soy en C#, aunque el lenguaje no me obligue a serlo.
Me gustó tu respuesta, Alexei Humeniy, ya estamos claros. Veo que te juzgué mal, pensé que eras de los tantos que hablan menospreciando a VB, y simplemente veo que no te agrada el lenguaje y tienes tus motivos lo cual está mejor que la respuesta de arriba.
Sobre lo de Microsoft, sí puede ser, le hizo lo mismo al Fox Pro donde no entraban en sus planes. Ya veremos.
Saludos,
Que tonto más grave. Mr. X, vuelve a tu sótano.
Si claro Mr. Y
Regreso a “mi sótano”, si soy tonto no se qué serás tú que sólo publicas sin ningún argumento. Arriba dije los motivos de mi molestia, Alexei me contestó amablemente, cero problemas.
Pero luego llegas tú agrediendo así nada más, insisto, si soy tonto y vivo en mi sótano no se donde vivirás tú jeje. Trata de postear con argumentos. En fin.
Saludos y paz.
Prefiero Qt.
creo que QT no funciona en gnome =( solo en KDE. a mi me gustaria que GTK en Windows tenga eso de arrastrar botones que te facilita la vida
Creo que todos los lenguajes tienen sus funcionalidades especificas, hay gustos y gustos, realmente si uno es buen programador podra hacer buenas herramientas. C# es un un buen lenguaje como lo son otros, realmente VB en su tiempo era un joya, sinceramente para criticar los lenguajes de programacion hay que aprenderlos y ver los alcances que tiene cada uno de ellos.
Saludos y PAZ
Hola, Realmente estoy Desesperado, nunca habia usado MonoDevelop y me dejaron un proyecto utilizando esto, Quisiera Saber como Puedo Programar una Interfaz de Visual Basic aqui, no se ni donde comenzar ni que codificar, esta Cuestion me esta quemando el COCO!!! AYUDA!!!
Bueno, considera este proyecto como una oportunidad para saber de primera fuente porqué Visual Studio cuesta lo que cuesta =)
Sería bueno que aclarases más tu duda. ¿Tienes problemas con el diseño de la interfaz, programación de ésta u otra cosa?
Bueno, Carlos, considera este proyecto como una oportunidad para saber de primera fuente porqué Visual Studio cuesta lo que cuesta =)
Sería bueno que aclarases más tu duda. ¿Tienes problemas con el diseño de la interfaz, programación de ésta u otra cosa?