sabato 9 novembre 2013

Tutorial GTK+ 3.0 . Parte 3 - Packing

Durante lo sviluppo di una applicazione, potreste avere bisogno di aggiungere più oggetti in una finestra. L'esempio precedente ha usato solamente un widget e abbiamo utilizzato semplicemente una chiamata alla funzione  gtk_container_add() per "impacchettare" il widget dentro la finestra.Ma quando avete bisogno di aggiungere più oggetti in una finestra, diviene importante controllare in che modo ogni widget deve essere posizionato e dimensionato. Ecco a cosa serve l'impacchettamento. GTK+ contiene una vasta collezione di containers la cui funzione è quella di controllare il layout dei widget figli aggiunti alla finestra. Vedi Layout Containers per una visione generale. L'esempio seguente mostra come il container GtkGrid vi permette di sistemare i tasti: ecco a voi il famoso Hello World in GTK+:
#include <gtk/gtk.h>

static void print_hello (GtkWidget *widget, gpointer   data){
  g_print ("Hello World\n");
}

int main (int   argc, char *argv[]){
  GtkWidget *window;
  GtkWidget *grid;
  GtkWidget *button;

  /* Questa è una funzione di callback. Gli argomenti da riga di comando
 * vengono ignorati in questo esempio. Se ne parlerà più avanti di queste funzioni.
 */
  gtk_init (&argc, &argv);

  /* crea una nuova finestra e imposta il titolo */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Grid");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  /* Qui creiamo il container per impacchettare i vari widget */
  grid = gtk_grid_new ();

  /* aggiunge il container alla finestra */
  gtk_container_add (GTK_CONTAINER (window), grid);

  button = gtk_button_new_with_label ("Button 1");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

  /* Posiziona il primo tasto nella cella (0, 0), e gli fa occupare
   * solo 1 cella orizzontalmente e verticalmente
   */
  gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);

  button = gtk_button_new_with_label ("Button 2");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

  /* Posiziona il secondo tasto nella cella (1, 0), e gli fa occupare
   * solo una cella orizzontalmente and verticalmente
   */
  gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);

  button = gtk_button_new_with_label ("Quit");
  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);

  /* Posiziona il tasto Quit(Esci) nella cella (0, 1), e gli fa riempire
   * 2 colonne.
   */
  gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);

  /* Ora che abbiamo impacchettato i widgets, li mostriamo tutti 
   * in una volta, chimaando gtk_widget_show_all() sulla finestra.
   * This call recursively calls gtk_widget_show() on all widgets
   * that are contained in the window, directly or indirectly.
   */
  gtk_widget_show_all (window);

  /* Tutte le applicazioni GTK+ devono avere un gtk_main(). Il controllo finisce qui
   * e rimane in attesa di un qualche evento (come la pressione di un tasto
   * o un evento del mouse) fintantoché gtk_main_quit() viene invocato.
   */
  gtk_main ();

  return 0;
}

Nessun commento:

Posta un commento