виджеты контейнеры
контейнер событий (the
eventbox)
некоторые
виджеты gtk не имеют собственных окон
(x windows), поэтому используют родительские.
из-за этого, они не могут получать события
и в результате могут иметь неправильный
размер и т.д. если вы хотите большего от
этих виджетов, eventbox - для вас.
на первый взгляд виджет eventbox кажется
бесполезным. он не создает ничего на
экране и не отвечает ни на какие события.
однако, он выполняет функцию
обеспечения дочернего виджета окном.
это важно потому, что многие виджеты
gtk не имеют ассоциированных окон (x
window). отсутствие окна экономит память
и улучшает работу, но и имеет некоторые
недостатки. виджет без окна x не может
получить события и не имеет привязки к
его содержимому. хотя название eventbox
подчеркивает его функцию обработки
событий (event-handling), его можно также
использовать для прерывания (подробнее
смотрите пример ниже).
создание нового виджета
eventbox:
gtkwidget *gtk_event_box_new( void );
|
добавляем в виджет eventbox дочерний
виджет:
gtk_container_add (gtk_container (event_box), child_widget);
|
следующий
пример демонстрирует обе возможности
eventbox - в нём создаётся длинный ярлык
прикрепленный к маленькому контейнеру,
при нажатии кнопкой мыши на ярлыке
происходит выход из программмы. изменение
размера окна раскрывает полное содержимое
ярлыка.

#include <stdlib.h>
#include <gtk/gtk.h>
int main( int argc,
char *argv[] )
{
gtkwidget *window;
gtkwidget *event_box;
gtkwidget *label;
gtk_init (&argc, &argv);
window = gtk_window_new (gtk_window_toplevel);
gtk_window_set_title (gtk_window (window), "event box");
g_signal_connect (g_object (window), "destroy",
g_callback (exit), null);
gtk_container_set_border_width (gtk_container (window), 10);
/* создаём контейнер события и добавляем его в основное окно */
event_box = gtk_event_box_new ();
gtk_container_add (gtk_container (window), event_box);
gtk_widget_show (event_box);
/* создаём длинный ярлык */
label = gtk_label_new ("click here to quit, quit, quit, quit, quit");
gtk_container_add (gtk_container (event_box), label);
gtk_widget_show (label);
/* делаем усечение */
gtk_widget_set_size_request (label, 110, 20);
/* и связываем с этим действие */
gtk_widget_set_events (event_box, gdk_button_press_mask);
g_signal_connect (g_object (event_box), "button_press_event",
g_callback (exit), null);
gtk_widget_realize (event_box);
gdk_window_set_cursor (event_box->window, gdk_cursor_new (gdk_hand1));
gtk_widget_show (window);
gtk_main ();
return 0;
}
|
|