Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

 setlocale(LC_ALL, "ru_RU.KOI8-R");

 caption = g_strdup_printf("Доброго времени суток!");

 gtk_init(&argc, &argv);

 window = gtk_window_new( GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window), "delete_event",

GTK_SIGNAL_FUNC(delete_event), NULL);

 gtk_signal_connect(GTK_OBJECT(window), "destroy",

GTK_SIGNAL_FUNC(destroy), &ctrl);

 gtk_window_set_title(GTK_WINDOW(window), caption);

 gtk_container_set_border_width(GTK_CONTAINER(window), 10);

 button = gtk_button_new;

 label = gtk_label_new(" -==
Нажмите кнопку ==- " );

 ctrl.app_window = window;

 ctrl.label = label;

 gtk_container_add(GTK_CONTAINER(button), label);

 gtk_container_add(GTK_CONTAINER(window), button);

 gtk_signal_connect(GTK_OBJECT(button), "clicked",

GTK_SIGNAL_FUNC(button_click), &ctrl);

 gtk_widget_show_all(window);

 gtk_main;

 return(0);

}

// ****************************************************

void quit_confirm(GtkWidget *widget) {

 GtkWidget *quit_form;

 GtkWidget *label;

 GtkWidget *yes_button, *no_button;

 quit_form = gtk_dialog_new;

 gtk_window_set_position(GTK_WINDOW(quit_form),

GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(quit_form),

10);

 label =

gtk_label_new("\n Вы действительно хотите выйти? \n*);

 yes_button = gtk_button_new_with_label("Да");

 no_button = gtk_button_new_with_label("Нет");

 gtk_signal_connect_object(GTK_OBJECT(yes_button),

"clicked",

GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)widget);

 gtk_container_add(

GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), yes_button);

 gtk_signal_connect_object(GTK_OBJECT(no_button),

"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),

(gpointer)quit_form);

 gtk_container_add(

GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), no_button);

 gtk_container_add(

GTK_CONTAINER(GTK_DIALOG(quit_form)->vbox), label);

 gtk_window_set_modal(GTK_WINDOW(quit_form), TRUE);

 gtk_widget_show_all(quit_form);

}

gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 quit_confirm(widget);

 return(TRUE);

}

void destroy(GtkWidget *widget, gpointer data) {

 printf{"GOOD-BYE!");

 gtk_main_quit;

}

static void button_click(GtkWidget *widget,

 gpointer data ) {

 static gint i = 0;

 GtkWidget *app_window;

 GtkWidget *label;

 gchar msg[256];

 app_window = GTK_WIDGET(((w_ctrl *)data)->app_window);

 label = GTK_WIDGET(((w_ctrl*)data)->label);

 i++;

 sprintf(msg, "Вы
нажали кнопку: %d раз(а)", i);

 gtk_label_set_text(GTK_LABEL(label), msg);

}

Думаю, текст программы ясен без лишних комментариев. Нужно лишь пояснить один очень важный момент. Обратите внимание на то, что мы переопределили обработчик для события

delete_event
.

gtk_signal_connect(GTK_OBJECT(window), "delete_event",

 GTK_SIGNAL_FUNC(delete_event), NULL);

gtk_signal_connect(GTK_OBJECT(window), "destroy",

 GTK_SIGNAL_FUNC(destroy), &ctrl);

Если данный обработчик возвращает FALSE, то будет вызвана функция destroy, которая уничтожит окно. Мы переписали функцию delete_event так, чтобы она всегда возвращала TRUE, то есть функция destroy вообще не будет вызвана. Но в таком случае наше окно вообще никогда не закроется, поэтому нужно, чтобы кто-то позаботился о закрытии окна. Это будет функция quit_confirm, отображающая диалог завершения работы.

gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 quit_confirm(widget);

 return(TRUE);

}

Рис. 23.6. Программа только запущена

Рис. 23.7. Пользователь нажал на кнопку 4 раза

Рис. 23.8. Диалог завершения работы

Поделиться:
Популярные книги

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Я Гордый часть 5

Машуков Тимур
5. Стальные яйца
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Я Гордый часть 5

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Чужак из ниоткуда 2

Евтушенко Алексей Анатольевич
2. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 2

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

Кай из рода красных драконов 2

Бэд Кристиан
2. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов 2

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Тринадцатый XIII

NikL
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Тринадцатый XIII

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Кодекс Охотника. Книга ХХХ

Винокуров Юрий
30. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга ХХХ

Мечников. Клятва лекаря

Алмазов Игорь
2. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
6.60
рейтинг книги
Мечников. Клятва лекаря

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия