| |
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 |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |