El entorno gráfico que se usa en Linux, y en todos los Unix, es X. Escribí también una introducción a las características de X. Resumiendo: X no dice cómo deben dibujarse los elementos de una interfaz, y es por eso que uno puede elegir entre varias bibliotecas y es por eso que esas bibliotecas pudieron ir evolucionando y ser cada vez más amigables y fáciles de usar.
El programador Windows viene de un mundo muy diferente. En ese mundo, hacer aplicacioens gráficas en C es muy complicado. Entonces, programadores que prefieren ese lenguaje terminan usando cosas como Visual Basic. Pero lo que hay que notar es que lo complicado de usar C en Windows no es lidiar con el lenguaje, sino hacerlo con la API y con las monstruosidades que Microsoft fue contruyendo encima.
En Linux, programar en C aplicaciones con interfaz gráfica es enormemente más sencillo. Una de las bibliotecas más recomendadas para hacerlo se llama GTK+. Existe también un competidor, que es Qt, pero tiene la limitación de que solamente se puede usar gratuitamente al desarrollar software libre.
Si bien GTK+ está hecho en C, es una biblioteca orientada a objetos. Esto... ¿qué quiere decir? ¿Objetos en C? ¿No será en C++? No no, objetos en C. Los creadores de GTK+ desarrollaron todo un framework para usar orientación de objetos en C, y es bastante simpático.
En GTK+ a cada componente gráfico que uno puede poner en una ventana se le llama widget. Todo widget es un objeto, por lo tanto hay una jerarquía de clases de widgets.
La interfaz de una aplicación se construye instanciando widgets y vinculándolos entre sí. Los widgets también emiten "señales", que son mensajes a los que uno se puede suscribir para realizar alguna tarea. Se activan, por ejemplo, cuando se hizo click en un botón.
Veamos un programa ejemplo para apreciar qué forma toma esto:
#include <gtk/gtk.h> int main(int argc, char **argv) { GtkWidget *w, *label; gtk_init(&argc, &argv); /* Creo la ventana */ w = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* Le pongo un título */ gtk_window_set_title(GTK_WINDOW(w), "Hola, mundo"); /* Creamos un "label". */ label = gtk_label_new("Hola, mundo!"); /* ... y lo agregamos a la ventana. */ gtk_container_add(GTK_CONTAINER(w), label); gtk_widget_show_all(w); /* Finalmente entramos en el bucle principal. */ gtk_main(); return 0; }
Compilar con cc hola.c -o hola $(pkg-config gtk+-2.0 --cflags --libs).
Existe también un wrapper de GTK+ que permite utilizarla desde C++, y que es bastante elegante, se llama gtkmm.
Glade es una aplicación que nos permite dibujar la interfaz de una aplicación GTK+. Si uno conoce conceptualmente GTK+ Glade es muy fácil de utilizar y hace trivial mantener y modificar la interfaz de nuestra aplicación. Permite ver, mientras editamos, cómo va a quedar exactamente nuestra aplicación y no nos oculta nada de las capacidades de GTK+. Más información en la página de Glade.
Ya continuaré esta explicación. Mientras tanto recomiendo ir investigando GTK+ (y Glade).