меню
есть два способа создать меню - легкий
и сложный. оба способа могут использоваться,
но обычно используется itemfactory (лёгкий
путь). "сложный" путь состоит в
том, чтобы создать все меню, используя
вызовы непосредственно. "лёгкий"
путь заключается в том, что используется
вызов gtk_item_factory. в каждом подходе есть
свои преимущества и недостатки.
itemfactory («фабрика» пунктов меню)
простой способ создания и добавления
пунктов в меню, при создании нескольких
функций оболочек для создания меню.
используя ручной метод можно пойти
длинным путём для удобства и простоты
использования. с itemfactory, не возможно
добавить изображения или символ '/' в
меню.
пошаговое создание
меню
сначала
мы рассмотрим сложный путь создания
меню.
есть три виджета,
которые входят в создание строки меню
(menubar) и суб меню (submenus):
пункт меню -
то, что пользователь может выбрать,
например "сохранить" ("save")
меню - выполняющее
роль контейнера для пунктов меню
строка меню -
выполняет роль контейнера для встроенных
меню
всё
немного усложнено тем фактом, что виджеты
пункта меню используются для двух
различных целей. они являются виджетами
упакованными в меню и виджетами
упакованными в строку меню, которая при
выборе активизирует встроенное меню.
рассмотрим
функции для создания меню и строк меню.
первая функция используется для создания
нового меню.
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 );
|
вот список шагов
для создания панели меню с прикрепленным
пунктом панели меню.
создаём новое
меню using gtk_menu_new()
многократный
вызов функции 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(). это также может быть
меню, которое размещено на панели меню,
как показано в типовом коде.
|