Параметр flags
определяет комбинацию свойств диалогового окна:
□ GTK_DIALOG_MODAL
;
□ GTK_DIALOG_DESTROY_WITH_PARENT
;
□ GTK_DIALOG_NO_SEPARATOR
.
Вы можете комбинировать флаги с помощью поразрядной операции OR
; например, комбинация GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR
означает одновременно и модальное окно, и окно без разделительной линии между основной областью окна и областью кнопок.
Оставшиеся параметры — это NULL
-терминированный список кнопок и код соответствующего отклика. Вы поймете, что именно означает этот код отклика, когда познакомитесь с функцией gtk_dialog_run
. Обычно кнопки выбираются из длинного списка готовых кнопок, которые определяет GTK+, поскольку вы получите уже готовые пиктограммы в кнопках.
Далее показано, как бы вы создавали диалоговое окно с кнопками OKи Cancel, которое возвращает GTK_RESPONSE_ACCEPT
и GTK_RESPONSE_REJECT
при нажатии этих кнопок:
GtkWidget *dialog = gtk_dialog_new_with_buttons("Important question",
parent_window,
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK,
GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT, NULL);
Мы остановились на двух кнопках, но на самом деле на количество кнопок в диалоговом окне нет ограничений. Более того, вы можете выбирать из ряда флагов типа отклика. Флаги accept
(принять) и reject
(отвергнуть) не применяются в стандарте GNOME и могут использоваться в ваших приложениях по вашему усмотрению. (Помните о том, что accept
в вашем приложении должен означать "принять".) Другие варианты, включая отклик OK и CANCEL, приведены в типе GtkResponseType enum
в следующем разделе.
Естественно, вы должны вставить содержимое в ваше диалоговое окно и для этого объект GtkDialog
содержит готовый упаковочный контейнер GtkVBox
для заполнения виджетами. Вы получаете указатель прямо из объекта:
GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;
Этот GtkVBox
применяется обычным способом с помощью функции gtk_box_pack_start
или чего-то подобного.
После того как диалоговое окно создано, следующий шаг — представить его пользователю и ждать от него ответа. Сделать это можно двумя способами: в модальном режиме, который блокирует весь ввод за исключением диалогового окна, или в немодальном режиме, который воспринимает диалоговое окно как любое другое окно. Давайте сначала рассмотрим запуск модального диалогового окна.
Модальное диалоговое окно
Модальное диалоговое окно заставляет пользователя ответить до того, как сможет выполниться любое другое действие. Оно полезно в тех ситуациях, когда пользователь собирается сделать что-то, сопряженное с серьезными последствиями, или нужно вывести сообщения об ошибках и предупреждениях.
Диалоговое окно можно сделать модальным, установив флаг 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
.
Читать дальше