Книга: Основы программирования в Linux
GtkDialog
GtkDialog
Как вы можете видеть, объект GtkDialog
— потомок объекта GtkWindow
и наследует все его функции и свойства.
GtkWindow
делит окно на две области, одна для содержимого виджета и другая для кнопок, которые располагаются вдоль нижнего края окна. Вы можете задать нужные вам кнопки и другие параметры диалогового окна во время его создания.
+----GtkDialog
GtkDialog
GtkWidget* gtk_dialog_new_with_buttons(const gchar *title,
GtkWindow *parent, GtkDialogFlags flags,
const gchar *first button text, ...);
Эта функция создает диалоговое окно с заголовком и кнопками. Второй параметр, parent
, должен указывать на главное окно вашего приложения, чтобы комплект GTK+ мог убедиться в том, что диалоговое окно остается присоединенным к главному окну и минимизируется при сворачивании главного окна.
Параметр 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
или чего-то подобного.
После того как диалоговое окно создано, следующий шаг — представить его пользователю и ждать от него ответа. Сделать это можно двумя способами: в модальном режиме, который блокирует весь ввод за исключением диалогового окна, или в немодальном режиме, который воспринимает диалоговое окно как любое другое окно. Давайте сначала рассмотрим запуск модального диалогового окна.