GTK+ 2.0 Tutorial

<<< Previous

Moving On

Next >>>


Обновленный Hello World

Давайте рассмотрим helloworld с улучшенными примерами обратных вызовов. Это приблизит нас к следующей теме, упаковочные виджеты (packing widgets).

#include <gtk/gtk.h> /* Новый обратный вызов. Данные переданные этой функции выводятся на stdout */ void callback( GtkWidget *widget, gpointer data ) { g_print ("Hello again - %s was pressed\n", (gchar *) data); } /* другой обратный вызов */ gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit (); return FALSE; } int main( int argc, char *argv[] ) { /* Тип указателей на виджеты - GtkWidget */ GtkWidget *window; GtkWidget *button; GtkWidget *box1; /* Этот вызов присутствует во всех программах GTK. Разбираются аргументы командной строки и возвращаются программе */ gtk_init (&argc, &argv); /* Создаём основное окно программы */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* Новый вызов который устанавливает заголовок * окна "Hello Buttons!" */ gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!"); /* Определяем обработчика сигналов delete_event * для выхода из GTK. */ g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); /* Устанавливаем ширину окантовки окна программы */ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Создаём контейнер для упаковки виджетов. Реально контейнер не отображается, он используется как инструмент для размещения виджетов */ box1 = gtk_hbox_new (FALSE, 0); /* Помещаем контейнер в основное окно. */ gtk_container_add (GTK_CONTAINER (window), box1); /* Создаём кнопку с надписью "Button 1". */ button = gtk_button_new_with_label ("Button 1"); /* Размещаем кнопку "button 1" в качестве аргумента для функции обратного вызова, для того, чтобы вызывать эту функцию при нажатии на кнопку.*/ g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "button 1"); /* Вместо gtk_container_add, мы упаковываем кнопку * в невидимый контейнер который был помещен в основное окно. */ gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0); /* Обязательное действие для отображения сформированной кнопки */ gtk_widget_show (button); /* Повторяем теже самые действия для создания второй кнопки */ button = gtk_button_new_with_label ("Button 2"); /* Вызываем туже функцию но в качестве аргумента передаём вторую кнопку. */ g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "button 2"); gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0); /* Порядок отображения виджетов неважен, но рекомендуется последним вызывать отображение основного окна. */ gtk_widget_show (button); gtk_widget_show (box1); gtk_widget_show (window); /* Входим в gtk_main и ждем событий X сервера для начала выполнения действий! */ gtk_main (); return 0; }

Скомпилируйте эту программу используя команду приведенную в первом примере. Вы заметите, что нет способа выйти из программы кроме как использование менеджера окон, или уничтожение процесса из командной строки. Было-бы хорошо, если читатель сам вставил в программу третью кнопку для выхода. Вы также сможете поиграть с опциями gtk_box_pack_start() после прочтения следующей секции. Попробуйте по изменять размеры окна и посмотреть, что из этого получится.


<<< Previous

Home

Next >>>

More on Signal Handlers

Up

Packing Widgets