GTK+ 2.0 Tutorial

<<< Previous

Menu Widget

Next >>>


Пример производства пунктов меню

Пример использования производства пунктов (item factory) GTK.

/* Начало примера меню itemfactory.c */ #include &lt;gtk/gtk.h&gt; #include &lt;strings.h&gt; /* Обязательный основной обратный вызов */ static void print_hello( GtkWidget *w, gpointer data ) { g_message ("Hello, World!\n"); } /* Для контрольной кнопки */ static void print_toggle(gpointer callback_data, guint callback_action, GtkWidget *menu_item) { g_message ("Состояние контрольной кнопки - %d\n", GTK_CHECK_MENU_ITEM(menu_item)-&gt;active); } /* Для кнопки выбора */ static void print_selected(gpointer callback_data, guint callback_action, GtkWidget *menu_item) { if(GTK_CHECK_MENU_ITEM(menu_item)-&gt;active) g_message("Кнопка выбора %d выбрана\n", callback_action); } /* Наше меню, массив GtkItemFactoryEntry структур которые определяют каждый пункт меню */ static GtkItemFactoryEntry menu_items[] = { { "/_File", NULL, NULL, 0, "&lt;Branch&gt;" }, { "/File/_New", "&lt;control&gt;N", print_hello, 0, "<Item>" }, { "/File/_Open", "&lt;control&gt;O", print_hello, 0, "<Item>" }, { "/File/_Save", "&lt;control&gt;S", print_hello, 0, "<Item>" }, { "/File/Save _As", NULL, NULL, 0, "<Item>" }, { "/File/sep1", NULL, NULL, 0, "&lt;Separator&gt;" }, { "/File/Quit", "&lt;control&gt;Q", gtk_main_quit, 0, "<Item>" }, { "/_Options", NULL, NULL, 0, "&lt;Branch&gt;" }, { "/Options/tear", NULL, NULL, 0, "&lt;Tearoff&gt;" }, { "/Options/Check", NULL, print_toggle, 1, "&lt;CheckItem&gt;" }, { "/Options/sep", NULL, NULL, 0, "&lt;Separator&gt;" }, { "/Options/Rad1", NULL, print_selected, 1, "&lt;RadioItem&gt;" }, { "/Options/Rad2", NULL, print_selected, 2, "/Options/Rad1" }, { "/Options/Rad3", NULL, print_selected, 3, "/Options/Rad1" }, { "/_Help", NULL, NULL, 0, "&lt;LastBranch&gt;" }, { "/_Help/About", NULL, NULL, 0, "<Item>" }, }; static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); /* Возвращает виджет панель меню, сделанный из вышеупомянутого меню */ GtkWidget *get_menubar_menu( GtkWidget *window) { GtkItemFactory *item_factory; GtkAccelGroup *accel_group; /* Создаём группу акселераторов (shortcut keys) */ accel_group = gtk_accel_group_new (); /* Создаём ItemFactory (строку меню) */ item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "&lt;main&gt;", accel_group); /* Эта функция генерирует пункты меню. Передает item factory, номер пункта в массиве, массив непосредственно, а также любые данные обратных вызовов для пунктов меню. */ gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL); /* Прикрепляем новую группу акселераторов к окну. */ gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); /* Возвращаем фактически созданную производством пунктов (item factory) панель меню. */ return gtk_item_factory_get_widget (item_factory, "&lt;main&gt;"); } /* Всплывающее меню при нажатии на всплывающую кнопку */ static gint popup_cb(GtkWidget *widget, GdkEvent *event, GtkWidget *menu) { GdkEventButton *bevent = (GdkEventButton *)event; /* только нажатие кнопки */ if(event-&gt;type != GDK_BUTTON_PRESS) return FALSE; /* Отображаем меню */ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, bevent-&gt;button, bevent-&gt;time); return TRUE; } /* Тоже что и get_menubar_menu(), но возвращает кнопку с сигналом для всплывающего меню */ GtkWidget *get_popup_menu(void) { GtkItemFactory *item_factory; GtkWidget *button, *menu; /* Тоже что и выше, но без акселераторов */ item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "&lt;main&gt;", NULL); gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL); menu = gtk_item_factory_get_widget(item_factory, "&lt;main&gt;"); /* Кнопка для активизации всплывающего меню */ button = gtk_button_new_with_label("Popup"); /* Создаём всплывающее меню при щелчке */ g_signal_connect(G_OBJECT(button), "event", G_CALLBACK(popup_cb), (gpointer) menu); return button; } /* То же самое, но возвращается меню опций */ GtkWidget *get_option_menu(void) { GtkItemFactory *item_factory; GtkWidget *option_menu; /* Ещё раз, но без акселераторов */ item_factory = gtk_item_factory_new (GTK_TYPE_OPTION_MENU, "&lt;main&gt;", NULL); gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL); option_menu = gtk_item_factory_get_widget(item_factory, "&lt;main&gt;"); return option_menu; } /* Начальная функция */ int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *main_vbox; GtkWidget *menubar, *option_menu, *popup_button; /* Инициализация GTK */ gtk_init (&argc, &argv); /* Создаём окно */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_title (GTK_WINDOW(window), "Item Factory"); gtk_widget_set_size_request (GTK_WIDGET(window), 300, 200); /* Создаём vbox для размещения меню */ main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (window), main_vbox); /* получаем три типа меню */ /* Помните: все три меню созданы отдельно друг от друга */ menubar = get_menubar_menu (window); popup_button = get_popup_menu(); option_menu = get_option_menu(); /* Упаковываем всё вместе */ gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0); gtk_box_pack_end (GTK_BOX (main_vbox), popup_button, FALSE, TRUE, 0); gtk_box_pack_end (GTK_BOX (main_vbox), option_menu, FALSE, TRUE, 0); /* Отображаем виджет */ gtk_widget_show_all (window); /* КОНЕЦ! */ gtk_main (); return(0); } /* Конец примера */

<<< Previous

Home

Next >>>

Using ItemFactory

Up

Undocumented Widgets