MENU
Ci sono due modi per creare i menu, quello manuale e quello che si serve della funzione gtk_item_factory.
Il metodo che usa l'itemfactory è molto più semplice e rapido ma anche meno flessibile.
Iniziamo con la creazione manuale:
Ci sono tre widget che si usano con i menu:
menubar
menu
menu item
Le funzioni per la creazione di questi widget sono:
GtkWidget *gtk_menu_bar_new( void );
GtkWidget *gtk_menu_new( void );
GtkWidget *gtk_menu_item_new( void );
GtkWidget *gtk_menu_item_new_with_label( const char
*label );
Una volta creato un menu item bisogna inserirlo in un menu. Ciò può essere fatto con la funzione gtk_menu_append. Dovremo poi connettere un segnale per catturare la selezione del menu item da parte dell'utente. Per esempio per creare unmenu file standard con le voci Open, Save e Quit potremo usare il seguente codice:
file_menu = gtk_menu_new ();
/* Crea i menu items */
open_item = gtk_menu_item_new_with_label ("Open");
save_item = gtk_menu_item_new_with_label ("Save");
quit_item = gtk_menu_item_new_with_label ("Quit");
/* Li aggiunge al menu */
gtk_menu_append (GTK_MENU (file_menu), open_item);
gtk_menu_append (GTK_MENU (file_menu), save_item);
gtk_menu_append (GTK_MENU (file_menu), quit_item);
/* Attacca la funzione di callback al segnale activate */
gtk_signal_connect_object (GTK_OBJECT (open_items), "activate",
GTK_SIGNAL_FUNC (menuitem_response),
(gpointer) "file.open");
gtk_signal_connect_object (GTK_OBJECT (save_items), "activate",
GTK_SIGNAL_FUNC (menuitem_response),
(gpointer) "file.save");
gtk_signal_connect_object (GTK_OBJECT (quit_items), "activate",
GTK_SIGNAL_FUNC (destroy),
(gpointer) "file.quit");
gtk_widget_show (open_item);
gtk_widget_show (save_item);
gtk_widget_show (quit_item);
A questo punto creiamo una menubar ed un menu item ai quali aggiungere i nostri menu:
menu_bar = gtk_menu_bar_new ();
gtk_container_add (GTK_CONTAINER (window), menu_bar);
gtk_widget_show (menu_bar);
file_item = gtk_menu_item_new_with_label ("File");
gtk_widget_show (file_item);
Associamo il menu con il file_item.
void gtk_menu_item_set_submenu( GtkMenuItem
*menu_item, GtkWidget *submenu );
gtk_menu_item_set_submenu (GTK_MENU_ITEM
(file_item), file_menu);
Ed infine aggiungiamo il menu alla menubar
gtk_menu_bar_append (GTK_MENU_BAR
(menu_bar), file_item);
Se vogliamo che il menu sia giustificato a destra nella menu bar possiamo usare la seguente funzione prima di attaccarlo alla
menubar:
void gtk_menu_item_right_justify( GtkMenuItem
*menu_item );
Ecco l'esempio della creazione di un menu.
/* Inizio esempio menu menu.c */
#include <gtk/gtk.h>
static gint button_press
(GtkWidget *, GdkEvent *);
static void menuitem_response (gchar *);
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *menu;
GtkWidget *menu_bar;
GtkWidget *root_menu;
GtkWidget *menu_items;
GtkWidget *vbox;
GtkWidget *button;
char buf[128];
int i;
gtk_init (&argc, &argv);
/* crea una nuova finestra */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize (GTK_WIDGET (window), 200, 100);
gtk_window_set_title (GTK_WINDOW (window), "GTK Menu Test");
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
(GtkSignalFunc) gtk_main_quit, NULL);
/* Inizializziamo la menu-widget */
menu = gtk_menu_new ();
/* creiamo tre menu-entries */
for (i = 0; i < 3;
i++)
{
sprintf (buf, "Test-undermenu - %d", i);
/* Crea un nuovo menu-item con l'etichetta */
menu_items = gtk_menu_item_new_with_label (buf);
/* ...lo aggiunge al menu */
gtk_menu_append (GTK_MENU (menu), menu_items);
/* Connette il segnale */
gtk_signal_connect_object (GTK_OBJECT (menu_items), "activate",
GTK_SIGNAL_FUNC (menuitem_response), (gpointer) g_strdup (buf));
/* Mostra il widget */
gtk_widget_show (menu_items);
}
gtk_widget_show (root_menu);
/* Rendiano il nostro menu un sottomenu di
* "root menu" */
gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
/* Crea la menu-bar */
menu_bar = gtk_menu_bar_new ();
gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2);
gtk_widget_show (menu_bar);
/* Crea un button al quale attaccare il menu */
button = gtk_button_new_with_label ("press me");
gtk_signal_connect_object (GTK_OBJECT (button), "event",
GTK_SIGNAL_FUNC (button_press), GTK_OBJECT (menu));
gtk_box_pack_end (GTK_BOX (vbox), button, TRUE, TRUE, 2);
gtk_widget_show (button);
/* E infine aggiungiamo il menu-item to alla menu-bar */
gtk_menu_bar_append (GTK_MENU_BAR (menu_bar), root_menu);
/* Visualizza la finestra ed entra nel ciclo prinipale */
gtk_widget_show (window);
gtk_main ();
return(0);
}
static gint button_press
(GtkWidget *widget, GdkEvent *event)
{
if (event->type == GDK_BUTTON_PRESS) {
GdkEventButton *bevent = (GdkEventButton *) event;
gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL,
bevent->button, bevent->time);
return TRUE;
}