GTK+ 2.0 Tutorial |
||
---|---|---|
Есть два способа создать меню - легкий и сложный. Оба способа могут использоваться, но обычно используется 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 );
|
Вот список шагов для создания панели меню с прикрепленным пунктом панели меню.
Многократный вызов функции gtk_menu_item_new() для создания пунктов нового меню и использование gtk_menu_shell_append() для помещения пунктов в само меню.
Создание пункта корневого меню используя gtk_menu_item_new() размещенного в виде текста непосредственно на панели меню.
Используем gtk_menu_item_set_submenu() для прикрепления меню к корневому пункту меню (созданного шагом выше).
Создаём новую панель меню используя gtk_menu_bar_new. Этот шаг необходимо выполнить один раз для создания ряда меню на одной панели меню.
Используем gtk_menu_bar_append() для размещения корневого меню на панели меню.
Создание всплывающего меню - почти то же самое. Различие заключается в то, что меню не размещается автоматически ("automatically") в панели меню (menubar), а явно с помощью вызова функции gtk_menu_popup() при событии "нажатая кнопка". Вот шаги выполнения:
Создаём функцию обработки события. Она должна иметь прототип
static gint handler (GtkWidget *widget,
GdkEvent *event);
|
и использоваться для появления меню в момент возникновения события.
В обработчике события, если событие это - нажатие кнопки мыши, трактуется как (button event (which it is)) и используется как показано в образце кода для передачи информации в gtk_menu_popup().
Связываем обработчик события с виджетом
g_signal_connect_swapped (G_OBJECT (widget), "event",
G_CALLBACK (handler),
G_OBJECT (menu));
|
где widget это связываемый с обработчиком события виджет, handler - это обработчик события, а menu - меню созданное с помощью gtk_menu_new(). Это также может быть меню, которое размещено на панели меню, как показано в типовом коде.
Notebooks |
|
Manual Menu Example |