Часть 53. Область события

Иерархия наследования

Object
   +--- Widget
         +--- Container
               +--- Bin
                     +--- EventBox
         

Некоторые виджеты GTK не являются объектами X т.к. являются исключительно дочерними. Они не могут получать события при изменении размера и т.п. Если бы хотите большего от таких типов виджетов - то виджет области события - то, что Вам необходимо.

На первый взгляд виджет области события практически бесполезен. Он ничего не отрисовывает и не отвечает ни на какие события. Однако он действительно обеспечивает панель X для дочернего виджета. Это важно, т.к. много виджетов GTK не имеют связанной X панели. Не имея X панели, виджет экономит память и улучшает работу, но с другой стороны и имеет много недостатков. Виджет без X панели не может получать события и не является перерисовывающимся в зависимости от действия пользователя с программой. Хотя название EventBox подчеркивает обработку события, виджет может также использоваться и для отсечения:

Для создания нового виджета области события используется функция:

$event = new Gtk::EventBox();

Дочерний виджет может быть добавлен на этот виджет области события так:

$event_box->add( $child_widget );

53.1. Пример

Нижеследующий пример показывает использование виджета области события. На панели можно кликнуть, вызвав выход и изменять её размеры.

исходник

      
#!/usr/bin/perl -w

use 
Gtk
;
use 
strict
;

set_locale Gtk;
init Gtk;


my
 $false = 0;

my
 $true = 1;


my
 $window;

my
 $event_box;

my
 $label;


# Создаем панель
$window = new Gtk::Window( "toplevel" );
$window->set_title( "Виджет области события" );
$window->signal_connect( "destroy",

sub
 { Gtk->
exit
( 0 ); } );
$window->border_width( 10 );

# Создание виджета области события и добавление его на наш toplevel (??)
$event_box = new Gtk::EventBox();
$window->add( $event_box );
$event_box->show();

# Создание длинного лейбла
$label = new Gtk::Label( "Нажмите тут и закончите, закончите, закончите, закончите..." );
$event_box->add( $label );
$label->show();

# укоротить.
$label->set_usize( 110, 20 );

# Забиндить на нем событие
$event_box->set_events( 'button_press_mask');
$event_box->signal_connect( "button_press_event", 
sub
 {
Gtk->
exit
( 0 ); } );

# необходимая для X панели строка
$event_box->realize();

# 58 - некоторое число 'hand1', которое не работает в силу некоторых причин
$event_box->window->set_cursor( new Gtk::Gdk::Cursor( 58 ) );

$window->show();

main Gtk;

exit
( 0 );


# конец примера
      
   

скриншот