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

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

Жанры

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

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

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Кукловод

Майерс Александр
4. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кукловод

Катриона

Стивенсон Роберт Льюис
Приключения:
исторические приключения
8.62
рейтинг книги
Катриона

Воин-Врач

Дмитриев Олег
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
Воин-Врач

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Школа пластунов

Трофимов Ерофей
Одиночка
Фантастика:
боевая фантастика
5.00
рейтинг книги
Школа пластунов

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Матабар VIII

Клеванский Кирилл Сергеевич
8. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар VIII

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

Несгибаемый граф. Тетралогия

Яманов Александр
Нет пророка в своем отечестве
Фантастика:
альтернативная история
фэнтези
5.00
рейтинг книги
Несгибаемый граф. Тетралогия

Я еще не бог. Книга XXXV

Дрейк Сириус
35. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Я еще не бог. Книга XXXV