Модальное диалоговое окно заставляет пользователя ответить до того, как сможет выполниться любое другое действие. Оно полезно в тех ситуациях, когда пользователь собирается сделать что-то, сопряженное с серьезными последствиями, или нужно вывести сообщения об ошибках и предупреждениях.
Диалоговое окно можно сделать модальным, установив флаг
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
. В приведенном далее фрагменте программного кода показаны основные принципы использования немодального диалогового окна:
С немодальными диалоговыми окнами могут возникать сложности, т.к. от пользователя не требуется немедленного ответа, и он может свернуть диалоговое окно и забыть о нем. Вы должны предусмотреть действия при попытке пользователя повторно открыть диалоговое окно до закрытия первого экземпляра окна. Следует проверить, равен ли
NULL
указатель диалогового окна и если нет, повторно вывести уже открытое диалоговое окно на экран, вызвав функцию
gtk_window_present
. Вы увидите этот прием в действии в разд. "Приложение для работы с базой данных компакт-дисков" в конце данной главы.
GtkMessageDialog
Для очень простых диалоговых окон даже тип
GtkDialog
излишне сложен.
GtkDialog
+----GtkMessageDialog
С помощью типа
GtkMessageDialog
вы можете создать информационное диалоговое окно одной строкой программного кода.