The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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






Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру