Capítulo II: Programa Gráfico en C++.


Primer programa GTK (gtkmm) sin la ayuda de Glade

Práctica II-1: En Anjuta, crea un proyecto nuevo, selecciona programa proyecto Gtkmm 2.0 (por defecto el lenguaje de programación es  C++), como nombre practica_II_1  (o el que se te antoje).

Recuerda que dará error al generar el proyecto.

Edita el archivo configure en la carpeta correspondiente /home/[usuario]/Projects/practica_II_1 y reemplaza las alusiones a gtkmm-2.0 por gtkmm-2.4 (que es la librería que nosotros hemos instalado).

Personalmente, utilizo la pestaña "terminal" del propio Anjuta (abajo, con Build, Find, CVS,...) e introduzco
gedit  /home/[usuario]/Projects/practica_II_1/configure
posteriormente le doy a Ctrl+H (Reemplazar) y utilizo la opción reemplazar todos. (En segundas ocasiones, no se hace preciso escribir nada porque gedit memoriza los usos anteriores). GUARDAMOS el archivo, volvemos a Anjuta y le damos a Construir->AUTO GENERAR, y ya no debiera haber problemas.

Si al generar el proyecto no te aparece el archivo main.cc, sino otros distintos (nombre_programa.cc, windows1.cc, windows1.hh, windows1_glade.cc,  windows1_glade.hh ) tienes instalado el programa glademm que genera dichos archivos.  
Para seguir las siguientes instrucciones deberías desinstalarlo (provisionalmente).

Modificamos el archivo de main.cc para que quede tal que así:
/* Created by Anjuta version 1.2.4a */
/*    This file will not be overwritten */

#include <gtkmm.h>

int
main(int argc, char *argv[])

{   
     
    Gtk::Main programa(argc, argv);

    Gtk::Window miventanica;

    miventanica.set_title("¡OLÉ! viva Ubuntu");

    programa.run(miventanica);
   
    return 0;

}

Explicación:

#include <gtkmm.h>

Alguien ha hecho mucho trabajo por nosotros y ha diseñado todos los componentes que nos va a permitir la realización de aplicaciones gráficas. La libreria para C++ se encuentra en el archivo gtkmm.h (/usr/include/gtkmm-2.4/gtkmm.h)


Procesos en un entorno gráfico

Si nos vamos al menú principal de Ubuntu, a la opción Sistema->Administración->Monitor del Sistema, observamos que en la pestaña procesos aparecen todos los programas activos. Nuestro programa va a ser otro proceso más en nuestro sistema operativo.  Ejecútalo, y búscalo (recuerda que los procesos están por orden alfabético, así que busca y encontrarás el archivo practica_II_1, luego cierra el programa y observa como desaparece:




podríamos decir que la instrucción Gtk::Main programa(argc,argv);declara un proceso denominado programa, podría haberse llamado de otra forma, ES OBLIGATORIO EN TODO ARCHIVO EJECUTABLE Gtk. La instrucción lo declara pero no lo ejecuta o visualiza.

Antes de lanzar el proceso, es necesario declarar las características de nuestro interfaz (ventanas, botones,...). En este caso, solo hemos creado una ventana y establecido el título '¡OLÉ! viva Ubuntu".

Existen diferentes tipos de aplicaciones, con Gtk:Window miventanica;, declaramos una aplicación con una ventana estandar.

miventanica.set_title("¡OLÉ! viva Ubuntu");, es una instrucción que establece el título a la ventana principal.

Finalmente, la instrucción programa.run(miventanica); lanza o ejecuta el proceso.


int main(int argc, **char argv[]){
...
}

Nuestra función main es ligeramente diferente, ahora tiene argumentos.

Esta es la forma habitual de escribir main, argc es un entero que indica el número de argumentos enviados y argv es un puntero a punteros de cadena, esto es, que si nosotros enviamos algún argumento (en Anjuta, Construir->configurar parámetros del programa) estos se interpretan como cadenas.

Así, si escribimos en el terminal:

/home/[usuario]/Projects/practica_II_1/src/practica_II_1 hola a todos

argc, es igual a 4.
argv[0] es igual a /home/[usuario]/Projects/practica_II_1/src/practica_II_1
argv[1] es igual a hola
argv[2] es igual a a
argv[3] es igual a todos


Hagamos una prueba, modifiquemos el archivo anterior por el siguiente:

/* Created by Anjuta version 1.2.4a */
/*    This file will not be overwritten */

// Incluiremos la libreria gtkmm.h donde alguien ha hecho mucho trabajo por nosotros
// aquí se incluye todo el codigo para crear los componentes visuales
#include <gtkmm.h>
// biblioteca necesaria para utilizar GString
#include <glib.h>
// la función main, algo diferente
int main(int argc, char *argv[])
{  
    GString * mensaje; //declaración de la cadena mensaje
    mensaje = g_string_new( "Hola "); // primera asignación a la cadena mensaje
    if (argc>1)
    {
        g_string_append(mensaje, argv[1]); //si existe un argumento añade a Hola, el primer argumento.
    }else{
        g_string_append (mensaje, "DESCONOCIDO");// si no hay argumentos el mensaje es Hola DESCONOCIDO
    }
   
   
    Gtk::Main programa(argc, argv); // Crear un objeto Main de Gtk, obligatorio en todo proyecto GTKmm

    Gtk::Window miventanica;// Crear un objeto Window de Gtk -la ventanica -
   
    miventanica.set_title(mensaje->str);// establece el título

    programa.run(miventanica);// Echar a correr nuestra ventana
   
    return 0;
}

C++, no incluye "de serie" el tipo cadena (string) [no podía ser perfecto], así que para manipularlas de forma fácil (sin preocuparnos por la gestión de memoria) he utilizado GString, un tipo definido en glib.h, de ahí la instrucción #include <glib.h>.

Básicamente, miramos si argc es mayor que 1, esto es,  si existe algun argumento acompañando al nombre. Que sí, pues añadimos el primer argumento a "Hola ", que no, pues el título de la ventana será "Hola DESCONOCIDO".

Después de compilarlo, ejecuta en un terminal: /home/[usuario]/Projects/practica_II_1/src/practica_II_1 pepe
y aparecerá la misma ventana pero con un título diferente.

Desconozco, al día de hoy, porque es necesario pasar los argumentos argc y argv al proceso Gtk::Main en su declaración  (inicialización), pero lo cierto es que si no se realiza así la ejecución del programa (que no la compilación) da errores. Prueba a comentar los argumentos, graba el archivo, compílalo (no da error) y ejecútalo... observa los resultados (recuerda el uso de comentarios Gtk::Main programa(/*argc,argv*/);)
Añadiendo componentes
Inicio