GTK+ 2.0 Tutorial |
||
---|---|---|
Некоторые виджеты 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;
}
|
File Selections |
|
The Alignment widget |