GTK+ 2.0 Tutorial |
||
---|---|---|
Menu Widget |
Пример использования производства пунктов (item factory) GTK.
/* Начало примера меню itemfactory.c */
#include <gtk/gtk.h>
#include <strings.h>
/* Обязательный основной обратный вызов */
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)->active);
}
/* Для кнопки выбора */
static void print_selected(gpointer callback_data,
guint callback_action,
GtkWidget *menu_item)
{
if(GTK_CHECK_MENU_ITEM(menu_item)->active)
g_message("Кнопка выбора %d выбрана\n", callback_action);
}
/* Наше меню, массив GtkItemFactoryEntry структур которые определяют каждый пункт меню */
static GtkItemFactoryEntry menu_items[] = {
{ "/_File", NULL, NULL, 0, "<Branch>" },
{ "/File/_New", "<control>N", print_hello, 0, "<Item>" },
{ "/File/_Open", "<control>O", print_hello, 0, "<Item>" },
{ "/File/_Save", "<control>S", print_hello, 0, "<Item>" },
{ "/File/Save _As", NULL, NULL, 0, "<Item>" },
{ "/File/sep1", NULL, NULL, 0, "<Separator>" },
{ "/File/Quit", "<control>Q", gtk_main_quit, 0, "<Item>" },
{ "/_Options", NULL, NULL, 0, "<Branch>" },
{ "/Options/tear", NULL, NULL, 0, "<Tearoff>" },
{ "/Options/Check", NULL, print_toggle, 1, "<CheckItem>" },
{ "/Options/sep", NULL, NULL, 0, "<Separator>" },
{ "/Options/Rad1", NULL, print_selected, 1, "<RadioItem>" },
{ "/Options/Rad2", NULL, print_selected, 2, "/Options/Rad1" },
{ "/Options/Rad3", NULL, print_selected, 3, "/Options/Rad1" },
{ "/_Help", NULL, NULL, 0, "<LastBranch>" },
{ "/_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, "<main>",
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, "<main>");
}
/* Всплывающее меню при нажатии на всплывающую кнопку */
static gint popup_cb(GtkWidget *widget, GdkEvent *event, GtkWidget *menu)
{
GdkEventButton *bevent = (GdkEventButton *)event;
/* только нажатие кнопки */
if(event->type != GDK_BUTTON_PRESS)
return FALSE;
/* Отображаем меню */
gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
NULL, NULL, bevent->button, bevent->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, "<main>",
NULL);
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
menu = gtk_item_factory_get_widget(item_factory, "<main>");
/* Кнопка для активизации всплывающего меню */
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, "<main>",
NULL);
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
option_menu = gtk_item_factory_get_widget(item_factory, "<main>");
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);
}
/* Конец примера */
|
Using ItemFactory |
Undocumented Widgets |