Показ меню

Задача
Необходимо показать панель меню в верхней части окна GTK-приложения.

Решение
Создаем GtkMenu. Создаем отдельный объект GtkMenuItem для каждого элемента меню, который вы хотите показать, и добавляем каждый элемент меню в GtkMenu с помощью функции append(). Затем создаем главное меню GtkMenuItem с меткой, которая должна появиться в панели меню (т. е. «File» или «Options»). Добавляем меню к главному меню с помощью функции set_submenu(). Создаем GtkMenuBar и добавляем главное меню в панель меню с помощью функции append(). Наконец, добавляем панель меню к окну:

// создаем окно
$window = &new GtkWindow();
// создаем меню
$menu = &new GtkMenu();
// создаем элемент меню и добавляем его в меню$menu_item_1 = &new GtkMenuItem('Open');
$menu->append($menu_item_1);
// создаем следующий элемент меню и добавляем его в меню
$menu_item_2 = &new GtkMenuItem('Close');
$menu->append($menu_item_2);
// создаем еще один элемент меню и добавляем его в меню
$menu_item_2 = &new GtkMenuItem('Save');
$menu->append($menu_item_2);
// создаем главное меню и добавляем в него существующее меню
$root_menu = &new GtkMenuItem('File');
$root_menu->set_submenu($menu);
// создаем панель меню и добавляем в него главное меню
$menu_bar = &new GtkMenuBar();
$menu_bar->append($root_menu);
// добавляем панель меню к окну
$window->add($menu_bar);
// показываем окно
$window->show_all();
// необходимо обеспечить корректное завершение программы
function shutdown() { gtk::main_quit(); }
$window->connect('destroy','shutdown');
// запускаем цикл, обрабатывающий сигнал GTK
gtk::main();

Обсуждение
Меню вовлекает в иерархию совсем немного объектов.


GtkWindow (или другой контейнер) содержит GtkMenuBar. GtkMenuBar содержит GtkMenuItem для каждого меню верхнего уровня в панели меню (т. е. «File», «Options» или «Help»). Каждый элемент меню верхнего уровня GtkMenuItem имеет GtkMenu в качестве подменю. Это подменю содержит свои элементы GtkMenuItem, которые выводятся ниже меню верхнего уровня.

Как и любой GTK-элемент управления, объект GtkMenuItem может иметь функции обратного вызова, обрабатывающие сигналы. Когда элемент меню выбран, он выдает сигнал activate. Чтобы предпринять какие-либо действия в ответ на выбор элемента меню, свяжите его сигнал activate с функцией обратного вызова. Ниже приведена версия программы показа времени с кнопкой и меткой из рецепта 20.7 с двумя элементами меню – «Update», обновляющим время в метке, и «Quit», завершающим программу:

// создаем окно
$window = &new GtkWindow();
// создаем контейнер для метки и кнопки
$container = &new GtkVBox();
// создаем меню
$menu = &new GtkMenu();
// создаем элемент меню и добавляем его в меню
$menu_item_1 = &new GtkMenuItem('Update');
$menu->append($menu_item_1);
// создаем другой элемент меню и добавляем его в меню
$menu_item_2 = &new GtkMenuItem('Quit');
$menu->append($menu_item_2);
// создаем главное меню и добавляем в него существующее меню
$root_menu = &new GtkMenuItem('File');
$root_menu->set_submenu($menu);
// создаем панель меню и добавляем в него главное меню
$menu_bar = &new GtkMenuBar();
$menu_bar->append($root_menu);
// добавляем меню в контейнер
$container->add($menu_bar);
// создаем метку, показывающую время
$label = &new GtkLabel(strftime('%c'));
// добавляем метку в контейнер
$container->pack_start($label);
// создаем кнопку
$button = &new GtkButton('Update Time');
/* устанавливаем функцию update_time() в качестве функции обратного вызова
для сигнала «clicked» и передаем ей переменную $label */
$button->connect('clicked','update_time',$label);
function update_time($b,$lb) {
$lb->set_text(strftime('%c'));
}
// добавляем кнопку в контейнер
$container->pack_start($button);
// если выбран элемент меню Update, то вызываем функцию update_time()
$menu_item_1->connect('activate','update_time',$label);
// если выбран элемент меню Quit, то выходим
$menu_item_2->connect('activate','shutdown');
// добавляем контейнер к окну
$window->add($container);
// показываем окно
$window->show_all();
// необходимо обеспечить корректное завершение программы
function shutdown() { gtk::main_quit(); }
$window->connect('destroy','shutdown');// запускаем цикл, обрабатывающий сигнал GTK
gtk::main();

Функции обратного вызова связываются с элементами меню с помощью их методов connect().


Связь же между функциями обратного вызова и сигналами activate устанавливается ближе к концу программы, поскольку именно вызов $menu_item_1->connect() передает переменную $label функции update_time(). Для успешной передачи переменной $label функции update_time() в процессе выполнения программы необходимо вызывать функцию connect() уже после того, как переменная $label получит свое значение..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ аргументов программы
Анализ аргументов программы с помощью getopt
Показ в окне графических элементов управления
Показ в окне нескольких графических элементов управления
Программа: Командная оболочка

Вернуться в раздел: PHP / 20. PHP на стороне клиента