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

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

Жанры

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. Диалог завершения работы

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

Асана, пранаяма, мудра, бандха

Сарасвати Свами Сатьянанда
Дом и Семья:
здоровье и красота
8.33
рейтинг книги
Асана, пранаяма, мудра, бандха

Битва за небеса

Калашников Максим
Великие противостояния
Фантастика:
альтернативная история
4.67
рейтинг книги
Битва за небеса

12 тем. Маркетинг 21 века

Грант Джон
Документальная литература:
публицистика
5.00
рейтинг книги
12 тем. Маркетинг 21 века

Часовой: воин Ордена

Шторм Максим
2. Часовой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Часовой: воин Ордена

Чёрная магия (Сборник)

Гейман Нил
Шедевры фантастики
Фантастика:
фэнтези
6.40
рейтинг книги
Чёрная магия (Сборник)

Час дракона

Зайцев Михаил Георгиевич
1. Русский ниндзя
Детективы:
боевики
8.11
рейтинг книги
Час дракона

Серв-батальон

Ливадный Андрей Львович
10. Экспансия: История Галактики
Фантастика:
космическая фантастика
8.29
рейтинг книги
Серв-батальон

Зазвездный зов. Стихотворения и поэмы

Ширман Григорий Яковлевич
Серебряный век. Паралипоменон
Поэзия:
поэзия
5.00
рейтинг книги
Зазвездный зов. Стихотворения и поэмы

Слово воина

Прозоров Александр Дмитриевич
1. Ведун
Фантастика:
фэнтези
8.91
рейтинг книги
Слово воина

Метка Афины

Риордан Рик
3. Герои Олимпа
Детские:
детская фантастика
9.52
рейтинг книги
Метка Афины

Алиби

Браун Сандра
Любовные романы:
остросюжетные любовные романы
9.17
рейтинг книги
Алиби

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Играть... в тебя

Замок. Процесс. Америка. Три романа в одном томе

Кафка Франц
Проза:
классическая проза
5.00
рейтинг книги
Замок. Процесс. Америка. Три романа в одном томе

Карл Ругер. Боец

Мах Макс
1. Карл Ругер
Фантастика:
фэнтези
6.50
рейтинг книги
Карл Ругер. Боец