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

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

Жанры

Основы программирования в 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,

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

Рыцарь

Андрижески Дж. С.
5. Мост и Меч
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Рыцарь

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Дневник. Том III. 1860-1861. Созерцательное богословие. Крупицы от трапезы Господней

Кронштадтский Иоанн
Религия и эзотерика:
религия
православие
христианство
5.00
рейтинг книги
Дневник. Том III. 1860-1861. Созерцательное богословие. Крупицы от трапезы Господней

Два веса, две мерки (Due pesi due misure)

Вершинин Лев Александрович
Проза:
современная проза
повесть
рассказ
5.00
рейтинг книги
Два веса, две мерки (Due pesi due misure)

Сотворение мира.Книга вторая

Закруткин Виталий Александрович
2. Избранное в трех томах
Проза:
советская классическая проза
семейный роман
5.75
рейтинг книги
Сотворение мира.Книга вторая

Загадки истории. Факты. Открытия. Люди

Ермановская Анна Эдуардовна
Научно-образовательная:
история
7.00
рейтинг книги
Загадки истории. Факты. Открытия. Люди

Избранное. Компиляция. Книги 1-11

Пулман Филип
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
Избранное. Компиляция. Книги 1-11

Былое и думы.(Предисловие В.Путинцева)

Герцен Александр Иванович
Проза:
русская классическая проза
5.00
рейтинг книги
Былое и думы.(Предисловие В.Путинцева)

Антология советского детектива-44. Компиляция. Книги 1-20

Михеев Михаил Петрович
Детективы:
криминальные детективы
5.00
рейтинг книги
Антология советского детектива-44. Компиляция. Книги 1-20

Философия

Алексеев Петр Васильевич
Научно-образовательная:
философия
5.00
рейтинг книги
Философия

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

999 (сборник)

Кинг Стивен
Шедевры мистики
Фантастика:
ужасы и мистика
6.14
рейтинг книги
999 (сборник)

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Лекарь из Пустоты 7

Ермоленков Алексей
7. Лекарь из Пустоты
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Лекарь из Пустоты 7