GTK+ 2.0 Tutorial

<<< Previous

Next >>>


Меню

Есть два способа создать меню - легкий и сложный. Оба способа могут использоваться, но обычно используется Itemfactory (лёгкий путь). "Сложный" путь состоит в том, чтобы создать все меню, используя вызовы непосредственно. "Лёгкий" путь заключается в том, что используется вызов gtk_item_factory. В каждом подходе есть свои преимущества и недостатки.

Itemfactory («фабрика» пунктов меню) простой способ создания и добавления пунктов в меню, при создании нескольких функций оболочек для создания меню. Используя ручной метод можно пойти длинным путём для удобства и простоты использования. С Itemfactory, не возможно добавить изображения или символ '/' в меню.

Пошаговое создание меню

Сначала мы рассмотрим сложный путь создания меню.

Есть три виджета, которые входят в создание строки меню (menubar) и суб меню (submenus):

Всё немного усложнено тем фактом, что виджеты пункта меню используются для двух различных целей. Они являются виджетами упакованными в меню и виджетами упакованными в строку меню, которая при выборе активизирует встроенное меню.

Рассмотрим функции для создания меню и строк меню. Первая функция используется для создания нового меню.

GtkWidget *gtk_menu_bar_new( void );

 Можно использовать gtk_container_add() для упаковки в окно, или box_pack функцию для упаковки в контейнер - как некоторые кнопки.

GtkWidget *gtk_menu_new( void );

Эта функция возвращает указатель на вновь созданное меню; оно никогда не показывается (gtk_widget_show()), а служит контейнером для пунктов меню. Я надеюсь что это прояснит ниже приведённый пример.

Следующие три запроса используются, чтобы создать пункты меню, которые упакованы в меню и строки меню.

GtkWidget *gtk_menu_item_new( void ); GtkWidget *gtk_menu_item_new_with_label( const char *label ); GtkWidget *gtk_menu_item_new_with_mnemnonic( const char *label );

Эти вызовы функций используются для создания пунктов меню, которые должны быть показаны. Помните о различиях между "меню" созданного с использованием функции gtk_menu_new() и "пунктом меню" созданным с использованием функции gtk_menu_item_new(). Пункт меню является фактически кнопкой со связанным действием, а меню фактически является контейнером для пунктов меню.

Функции gtk_menu_item_new_with_label() и gtk_menu_item_new() создают ярлык для пункта меню и новый пункт меню соответственно, причём ярлык естественно упаковывается в пункт меню.

Как только пункт меню создан, его необходимо поместить в меню. Это делается с помощью функции gtk_menu_shelll_append. Для перехвата события "выбор пользователя", нужно пункт меню соединить с сигналом activate. Вот пример создания меню "файл" со стандартными пунктами открыть (Open), сохранить (Save), и выход (Quit):

file_menu = gtk_menu_new (); /* меню не нужно отображать */ /* Создаём новые пункты меню */ 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"); /* Добавляем их в само меню */ gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), open_item); gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), save_item); gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), quit_item); /* присоединяем функцию к сигналу выбора */ g_signal_connect_swapped (G_OBJECT (open_item), "activate", G_CALLBACK (menuitem_response), (gpointer) "file.open"); g_signal_connect_swapped (G_OBJECT (save_item), "activate", G_CALLBACK (menuitem_response), (gpointer) "file.save"); /* прикрепляем пункт меню Quit к функции выхода */ g_signal_connect_swapped (G_OBJECT (quit_item), "activate", G_CALLBACK (destroy), (gpointer) "file.quit"); /* отображаем пункты меню */ gtk_widget_show (open_item); gtk_widget_show (save_item); gtk_widget_show (quit_item);

Это наше меню. Теперь мы должны создать строку меню и пункт меню для входа «файл», к которому мы добавляем наше меню. Код примерно такой:

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);

Теперь нужно ассоциировать меню с 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);

Добавляем меню к строке меню:

void gtk_menu_bar_append( GtkMenuBar *menu_bar, GtkWidget *menu_item );

В нашем случае выглядит так:

gtk_menu_bar_append (GTK_MENU_BAR (menu_bar), file_item);

Если нам нужно меню справа, такое например как "помощь", то мы можем использовать следующую функцию (как и в текущем примере file_item ) после прикрепления к панели меню.

void gtk_menu_item_right_justify( GtkMenuItem *menu_item );

Вот список шагов для создания панели меню с прикрепленным пунктом панели меню.

Создание всплывающего меню - почти то же самое. Различие заключается в то, что меню не размещается автоматически ("automatically") в панели меню (menubar), а явно с помощью вызова функции gtk_menu_popup() при событии "нажатая кнопка". Вот шаги выполнения:


<<< Previous

Home

Next >>>

Notebooks

 

Manual Menu Example