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. Диалог завершения работы
Поделиться:
Популярные книги
Три `Д` для миллиардера. Свадебный салон
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Вираж бытия
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Провинциал. Книга 6
6. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Фараон
1. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вернуть невесту. Ловушка для попаданки
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Хозяйка дома на холме
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Идеальный мир для Лекаря 9
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Третье правило дворянина
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXII
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Лорд Системы 13
13. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Довлатов. Сонный лекарь 3
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
И только смерть разлучит нас
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Внешняя Зона
8. Real-Rpg
Фантастика:
фэнтези
попаданцы
рпг
5.00