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. Диалог завершения работы
Теперь рассмотрим обработчики событий кнопок Да и Нет диалога:
gtk_signal_connect_object(GTK_OBJECT(yes_button),
'clicked', GTK_SIGNAL_FUNC(gtk_widget_destroy),
(gpointer)widget);
gtk_signal_connect_object(GTK_OBJECT(no_button), 'clicked',
GTK_SIGNAL_FUNC(gtk_widget_destroy),(gpointer)quit_form);
Кнопка yes_button
вызывает функцию gtk_widget_destroy() и передает ей параметр (gpointer)widget, то есть уничтожает главное окно приложения, а кнопка no_button
передает функции gtk_widget_destroy() параметр (gpointer) quit_form. который указывает на окно диалога, то есть при нажатии этой кнопки будет закрыто само окно нашего диалога.
23.4.7. Меню
Меню программы вручную писать довольно неудобно, поэтому для разработки меню воспользуемся студией разработки графического интерфейса Glade.
23.4.8. Иерархия виджитов
GtkObject
+GtkWidget
| +GtkMisc
| | +GtkLabel
| | | +GtkAccelLabel
| | | `GtkTipsQuery
| | +GtkArrow
| | +GtkImage
| | `GtkPixmap
| +GtkContainer