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

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

Жанры

Основы программирования в Linux
Шрифт:

Модальное диалоговое окно

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

Диалоговое окно можно сделать модальным, установив флаг

GTK_DIALOG_MODAL
и вызвав функцию
gtk_widget_show
, но есть лучший путь. Функция
gtk_dialog_run
выполнит за вас всю тяжелую работу, остановив дальнейшее выполнение программы до тех пор, пока не
будет нажата кнопка в диалоговом окне.

Когда пользователь нажимает кнопку (или диалоговое окно уничтожается), функция

gtk_dialog_run
возвращает результат типа
int
, указывающий на кнопку, нажатую пользователем. В GTK+ очень кстати определен тип
enum
для описания возможных значений.

typedef enum {

 GTK_RESPONSE_NONE = -1,

 GTK_RESPONSE_REJECT = -2,

 GTK_RESPONSE_ACCEPT = -3,

 GTK_RESPONSE_DELETE_EVENT = -4

 GTK_RESPONSE_OK = -5,

 GTK_RESPONSE_CANCEL = -6,

 GTK_RESPONSE_CLOSE = -7,

 GTK_RESPONSE_YES = -8,

 GTK_RESPONSE_NO = -9,

 GTK_RESPONSE_APPLY = -10,

 GTK_RESPONSE_HELP = -11

} GtkResponseType;

Теперь мы можем объяснить код отклика, передаваемый в функцию

gtk_dialog_new_with_buttons
, — это код возврата типа
GtkResponseType
, который функция
gtk_dialog_run
возвращает, когда нажата кнопка. Если диалоговое окно уничтожается (это происходит, например, когда пользователь щелкает кнопкой мыши пиктограмму закрытия), вы получаете результат
GTK_RESPONSE_NONE
.

Для вызова соответствующих операторов идеально подходит конструкция

switch
:

GtkWidget* dialog = create_dialog;

int result = gtk_dialog_run(GTK_DIALOG(dialog));

switch(result) {

case GTK_RESPONSE_ACCEPT:

 delete_file;

 break;

сазе GTK_RESPONSE_REJECT:

 do_nothing;

 break;

default:

 dialog_was_cancelled;

 break;

}

gtk_widget_destroy(dialog);

Это все, что есть для простых модальных окон в комплекте инструментов GTK+. Как видите, включен очень небольшой программный код и потрачено немного усилий. В конце нужно только провести чистку с помощью функции

gtk_widget_destroy
.

Если вам понадобится немодальное диалоговое окно, все будет не так просто. Вы не сможете использовать функцию

gtk_dialog_run
, вместо нее придется связать функции обратного
вызова с кнопками диалогового окна.

Немодальные диалоговые окна

Мы рассмотрели, как применять функцию

gtk_dialog_run
для создания модального (блокирующего) диалогового окна. Немодальное окно действует несколько иначе, хотя и создается тем же способом. Вместо вызова функции
gtk_dialog_run
вы связываете функцию обратного вызова с сигналом отклика объекта
GtkDialog
, который генерируется при щелчке кнопки мышью или уничтожении окна.

Связывание сигнала обратного вызова выполняется обычным образом с той лишь разницей, что у функции обратного вызова появляется дополнительный аргумент отклика, играющий ту же роль, что код возврата функции

gtk_dialog_run
. В приведенном далее фрагменте программного кода показаны основные принципы использования немодального диалогового окна:

void dialog_button_clicked(GtkWidget *dialog, gint response,

 gpointer user_data) {

 switch (response) {

 case GTK_RESPONSE_ACCEPT:

do_stuff;

break;

 case GTK_RESPONSE_REJECT:

do_nothing;

break;

 default:

dialog_was_cancelled;

break;

 }

 gtk_widget_destroy(dialog);

}

int main {

 ...

 GtkWidget *dialog = create_dialog;

 g_signal_connect(GTK_OBJECT(dialog), "response",

GTK_SIGNAL_FUNC(dialog_button_clicked), user_data);

 gtk_widget_show(dialog);

 ...

}

С немодальными диалоговыми окнами могут возникать сложности, т.к. от пользователя не требуется немедленного ответа, и он может свернуть диалоговое окно и забыть о нем. Вы должны предусмотреть действия при попытке пользователя повторно открыть диалоговое окно до закрытия первого экземпляра окна. Следует проверить, равен ли

NULL
указатель диалогового окна и если нет, повторно вывести уже открытое диалоговое окно на экран, вызвав функцию
gtk_window_present
. Вы увидите этот прием в действии в разд. "Приложение для работы с базой данных компакт-дисков" в конце данной главы.

GtkMessageDialog

Для очень простых диалоговых окон даже тип

GtkDialog
излишне сложен.

GtkDialog

 +----GtkMessageDialog

С помощью типа

GtkMessageDialog
вы можете создать информационное диалоговое окно одной строкой программного кода.

GtkWidget* gtk_message_dialog_new(GtkWindow *parent,

 GtkDialogFlags flags, GtkMessageType type,

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

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

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

За Горизонтом

Вайс Александр
8. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
За Горизонтом

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Шаман

Седой Василий
5. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Шаман

Вперед в прошлое 6

Ратманов Денис
6. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 6

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Путешественник по Изнанке

Билик Дмитрий Александрович
4. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
попаданцы
мистика
5.00
рейтинг книги
Путешественник по Изнанке

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

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Седьмой Рубеж III

Бор Жорж
3. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж III