Естественно, вы должны вставить содержимое в ваше диалоговое окно и для этого объект 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
.
Если вам понадобится немодальное диалоговое окно, все будет не так просто. Вы не сможете использовать функцию 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: