The OpenNET Project / Index page

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

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

GTK+ 2.0 Tutorial

<<< Previous

Menu Widget

Next >>>


Пример производства пунктов меню

Пример использования производства пунктов (item factory) GTK.

/* Начало примера меню itemfactory.c */
#include &lt;gtk/gtk.h&gt;
#include &lt;strings.h&gt;
/* Обязательный основной обратный вызов */
static void print_hello( GtkWidget *w,
                         gpointer   data )
{
  g_message ("Hello, World!\n");
}
/* Для контрольной кнопки */
static void print_toggle(gpointer   callback_data,
                         guint      callback_action,
                         GtkWidget *menu_item)
{
   g_message ("Состояние контрольной кнопки - %d\n",
              GTK_CHECK_MENU_ITEM(menu_item)-&gt;active);
}
/* Для кнопки выбора */
static void print_selected(gpointer   callback_data,
                           guint      callback_action,
                           GtkWidget *menu_item)
{
   if(GTK_CHECK_MENU_ITEM(menu_item)-&gt;active)
     g_message("Кнопка выбора %d выбрана\n", callback_action);
}
/* Наше меню, массив GtkItemFactoryEntry структур которые определяют каждый пункт меню */
static GtkItemFactoryEntry menu_items[] = {
  { "/_File",         NULL,         NULL,           0, "&lt;Branch&gt;" },
  { "/File/_New",     "&lt;control&gt;N", print_hello,    0, "<Item>" },
  { "/File/_Open",    "&lt;control&gt;O", print_hello,    0, "<Item>" },
  { "/File/_Save",    "&lt;control&gt;S", print_hello,    0, "<Item>" },
  { "/File/Save _As", NULL,         NULL,           0, "<Item>" },
  { "/File/sep1",     NULL,         NULL,           0, "&lt;Separator&gt;" },
  { "/File/Quit",     "&lt;control&gt;Q", gtk_main_quit,  0, "<Item>" },
  { "/_Options",      NULL,         NULL,           0, "&lt;Branch&gt;" },
  { "/Options/tear",  NULL,         NULL,           0, "&lt;Tearoff&gt;" },
  { "/Options/Check", NULL,         print_toggle,   1, "&lt;CheckItem&gt;" },
  { "/Options/sep",   NULL,         NULL,           0, "&lt;Separator&gt;" },
  { "/Options/Rad1",  NULL,         print_selected, 1, "&lt;RadioItem&gt;" },
  { "/Options/Rad2",  NULL,         print_selected, 2, "/Options/Rad1" },
  { "/Options/Rad3",  NULL,         print_selected, 3, "/Options/Rad1" },
  { "/_Help",         NULL,         NULL,           0, "&lt;LastBranch&gt;" },
  { "/_Help/About",   NULL,         NULL,           0, "<Item>" },
};
static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
/* Возвращает виджет панель меню, сделанный из вышеупомянутого меню */
GtkWidget *get_menubar_menu( GtkWidget  *window)
{
  GtkItemFactory *item_factory;
  GtkAccelGroup *accel_group;
  /* Создаём группу акселераторов (shortcut keys) */
  accel_group = gtk_accel_group_new ();
  /* Создаём ItemFactory (строку меню) */
  item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "&lt;main&gt;",
                                       accel_group);
  /* Эта функция генерирует пункты меню. Передает item factory,
     номер пункта в массиве, массив непосредственно, а также любые
     данные обратных вызовов для пунктов меню. */
  gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
  /* Прикрепляем новую группу акселераторов к окну. */
  gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
  /* Возвращаем фактически созданную производством пунктов (item factory) панель меню. */
  return gtk_item_factory_get_widget (item_factory, "&lt;main&gt;");
}
/* Всплывающее меню при нажатии на всплывающую кнопку */
static gint popup_cb(GtkWidget *widget, GdkEvent *event, GtkWidget *menu)
{
   GdkEventButton *bevent = (GdkEventButton *)event;
  
   /* только нажатие кнопки */
   if(event-&gt;type != GDK_BUTTON_PRESS)
     return FALSE;
  
   /* Отображаем меню */
   gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
                  NULL, NULL, bevent-&gt;button, bevent-&gt;time);
  
   return TRUE;
}
/* Тоже что и get_menubar_menu(), но возвращает кнопку с сигналом для всплывающего меню */
GtkWidget *get_popup_menu(void)
{
   GtkItemFactory *item_factory;
   GtkWidget *button, *menu;
  
   /* Тоже что и выше, но без акселераторов */
   item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "&lt;main&gt;",
                                        NULL);
   gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
   menu = gtk_item_factory_get_widget(item_factory, "&lt;main&gt;");
  
   /* Кнопка для активизации всплывающего меню */
   button = gtk_button_new_with_label("Popup");
   /* Создаём всплывающее меню при щелчке */
   g_signal_connect(G_OBJECT(button),
                    "event",
                    G_CALLBACK(popup_cb),
                    (gpointer) menu);
   return button;
}
/* То же самое, но возвращается меню опций */
GtkWidget *get_option_menu(void)
{
   GtkItemFactory *item_factory;
   GtkWidget *option_menu;
  
   /* Ещё раз, но без акселераторов */
   item_factory = gtk_item_factory_new (GTK_TYPE_OPTION_MENU, "&lt;main&gt;",
                                        NULL);
   gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
   option_menu = gtk_item_factory_get_widget(item_factory, "&lt;main&gt;");
   return option_menu;
}
/* Начальная функция */
int main( int argc,
          char *argv[] )
{
  GtkWidget *window;
  GtkWidget *main_vbox;
  GtkWidget *menubar, *option_menu, *popup_button;
 
  /* Инициализация GTK */
  gtk_init (&argc, &argv);
 
  /* Создаём окно */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit),
                    NULL);
  gtk_window_set_title (GTK_WINDOW(window), "Item Factory");
  gtk_widget_set_size_request (GTK_WIDGET(window), 300, 200);
 
  /* Создаём vbox для размещения меню */
  main_vbox = gtk_vbox_new (FALSE, 1);
  gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1);
  gtk_container_add (GTK_CONTAINER (window), main_vbox);
 
  /* получаем три типа меню */
  /* Помните: все три меню созданы отдельно друг от друга */
  menubar = get_menubar_menu (window);
  popup_button = get_popup_menu();
  option_menu = get_option_menu();
  
  /* Упаковываем всё вместе */
  gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
  gtk_box_pack_end (GTK_BOX (main_vbox), popup_button, FALSE, TRUE, 0);
  gtk_box_pack_end (GTK_BOX (main_vbox), option_menu, FALSE, TRUE, 0);
  /* Отображаем виджет */
  gtk_widget_show_all (window);
  
  /* КОНЕЦ! */
  gtk_main ();
 
  return(0);
}
/* Конец примера */

<<< Previous

Home

Next >>>

Using ItemFactory

Up

Undocumented Widgets






Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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