GTK+ 2.0 Tutorial

<<< Previous

Next >>>


Виджеты контейнеры

Контейнер событий (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; }

<<< Previous

Home

Next >>>

File Selections

 

The Alignment widget