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. Диалог завершения работы
Поделиться:
Популярные книги
Газлайтер. Том 10
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 2
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
Звездная Кровь. Изгой
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Хозяин Теней 4
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки
Фантастика:
фэнтези
5.00
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Метатель
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Моя на одну ночь
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Чехов. Книга 2
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Хозяин Теней 2
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Сумеречный стрелок 7
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жизнь под чужим солнцем
Детективы:
прочие детективы
9.10
рейтинг книги
Красноармеец
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60