Согласно статистическим данным очень много людей интересуются созданием меню изучая http://linfoline.homedns.org/gtk/x1716.html
но данный способ считается устаревшим и поэтому решил написать простой пример создания основного меню приложения с использованием менеджера меню http://linfoline.homedns.org/gtk-2.10-refe...kUIManager.html
Для создания меню будет использоваться xml описание в виде отдельного файла menu.xml, хотя xml-описание можно включить непосредственно в код программы.
Пример:
Код:
#include <gtk/gtk.h>
// Функция формирования окна верхнего уровня
GtkWidget* toplevel_window();
// Функция формирования панели меню
GtkWidget* get_main_menu();
// Функция сообщающая об активации пункта меню
void action_activate();
int main( int argc,
char *argv[] )
{
// Обязательный вызов для всех GTK+ программ
gtk_init (&argc, &argv);
// Создаём окно верхнего уровня
GtkWidget *top_window = toplevel_window();
// Создаём основную панель меню
GtkWidget *main_menu = get_main_menu();
// Вертикальный контейнер для упаковки панели меню
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
// Упаковываем вертикальный контейнер в основное окно
gtk_container_add( GTK_CONTAINER(top_window), vbox);
// Упаковываем панель меню в вертикальный контейнер
gtk_box_pack_start( GTK_BOX(vbox), main_menu, FALSE, FALSE, 2);
// Отображаем сформированные виджеты
gtk_widget_show( vbox);
gtk_widget_show( main_menu);
gtk_widget_show( top_window);
// Основной цикл GTK+ программ
gtk_main ();
return 0;
}
GtkWidget* toplevel_window()
{
// Создаём новый виджет - окно верхнего уровня
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
// Устанавливаем заголовок окна
gtk_window_set_title( (GtkWindow*)window, "Пример создания меню");
// Устанавливаем размер окна по умолчанию в пикселах
gtk_window_set_default_size((GtkWindow*)window, 300, 100);
// Подключаем обработчик к сигналу delete_event
// то есть когда пользователь нажимает кнопку закрытия
// в верхнем правом углу окна программы будет вызвана
// функция gtk_main_quit для выхода из приложения
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (gtk_main_quit), NULL);
return (GtkWidget*)window;
}
GtkWidget* get_main_menu()
{
// Менеджер конструирования меню из xml описания
GtkUIManager *ui = gtk_ui_manager_new();
// Действие для главных пунктов меню
GtkActionGroup *menuactions;
// Действие для подпунктов меню
GtkAction *action;
// Переменная для хранения произошедшей ошибки
GError *error = NULL;
// Панель меню
GtkWidget *menubar;
// Новая группа действий основного меню <Файл>
menuactions = gtk_action_group_new("FileActions");
// Основное меню <Файл>
action = gtk_action_new("FileAction", "Файл", NULL, NULL);
// Добавляем действие в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее подменю <Создать>
action = gtk_action_new("SubMenuAction", "Создать", NULL, NULL);
// Добавляем дополнительное действие в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее пункт подменю <Новая вкладка>
action = gtk_action_new("NewNotebookAction", "Новая вкладка", NULL, NULL);
// Подключаем обработчик сигнала активизации меню
g_signal_connect_swapped (G_OBJECT (action), "activate",
G_CALLBACK (action_activate), "Новая вкладка");
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее пункт <Сохранить>
action = gtk_action_new("SaveAction", "Сохранить", NULL, NULL);
// Подключаем обработчик сигнала активизации меню
g_signal_connect_swapped (G_OBJECT (action), "activate",
G_CALLBACK (action_activate), "Сохранить");
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее пункт <Выход>
action = gtk_action_new("QuitAction", "Выход", NULL, NULL);
// Подключаем обработчик сигнала активизации меню
g_signal_connect_swapped (G_OBJECT (action), "activate",
G_CALLBACK (gtk_main_quit), NULL);
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Добавляем группу действий в менеджер меню
gtk_ui_manager_insert_action_group(ui, menuactions, 0);
// Освобождаем переменную для создания следующего действия
g_object_unref (menuactions);
// Новая группа действий <Вид>
menuactions = gtk_action_group_new("ViewMenuAction");
// Основное меню <Вид>
action = gtk_action_new("ViewMenuAction", "Вид", NULL, NULL);
// Добавляем действие в группу
gtk_action_group_add_action(menuactions, action);
// Дополнительное действие выводящее пункт <Подменю>
action = gtk_action_new("SubMenuViewAction", "Подменю", NULL, NULL);
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее пункт <Вид>
action = gtk_action_new("ItemSubMenuAction", "Пункт подменю", NULL, NULL);
// Подключаем обработчик сигнала активизации меню
g_signal_connect_swapped (G_OBJECT (action), "activate",
G_CALLBACK (action_activate), "Пункт подменю");
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Дополнительное действие выводящее пункт <Вид>
action = gtk_action_new("ViewAction", "Вид", NULL, NULL);
// Подключаем обработчик сигнала активизации меню
g_signal_connect_swapped (G_OBJECT (action), "activate",
G_CALLBACK (action_activate), "Пункт меню <Вид>");
// Добавляем в группу
gtk_action_group_add_action(menuactions, action);
// Освобождаем переменную для создания следующего действия
g_object_unref (action);
// Добавляем группу действий в менеджер меню
gtk_ui_manager_insert_action_group(ui, menuactions, 0);
// Освобождаем переменную
g_object_unref (menuactions);
// Формируем меню из xml описания
gtk_ui_manager_add_ui_from_file(ui, "menu.xml", &error);
menubar = gtk_ui_manager_get_widget( ui, "/menubar");
return menubar;
}
void action_activate(gchar *action)
{
// Создаём информационный диалог
GtkWidget *dialog = gtk_message_dialog_new( NULL,\
GTK_DIALOG_DESTROY_WITH_PARENT,\
GTK_MESSAGE_INFO,\
GTK_BUTTONS_CLOSE,\
"%s",\
action);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
xml-описание нашего меню в виде отдельного файла menu.xml
Код:
<ui>
<menubar>
<menu name="Файл" action="FileAction">
<menu name="Создать" action="SubMenuAction">
<menuitem name="Новая вкладка" action="NewNotebookAction" />
</menu>
<menuitem name="Сохранить" action="SaveAction" />
<separator/>
<menuitem name="Выход" action="QuitAction" />
</menu>
<menu name="Вид" action="ViewMenuAction">
<menu name="Подменю" action="SubMenuViewAction">
<menuitem name="Пункт подменю" action="ItemSubMenuAction" />
</menu>
<menuitem name="View" action="ViewAction" />
</menu>
</menubar>
</ui>
Скомпилировать пример можно командой
gcc `pkg-config --cflags --libs gtk+-2.0` menu.c -o menu
при условии что вы его поместили в файл menu.c и в вашей системе установлено всё необходимое