The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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






Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру