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

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

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

Конечно, значение локали у вас может быть другим. Эту функцию нужно вызвать ДО инициализации GTK+.

Рис. 23.2. Надпись

23.4. Виджиты

23.4.1. Рождение, смерть и состояния виджита

После создания виджита управление ресурсами и памятью, необходимыми ему, выполняется автоматически. Виджиты

уничтожаются также автоматически — при разрушении главного окна. Но иногда бывает нужно самостоятельно уничтожить виджит. Сделать это можно с помощью функции:

void gtk_widget_destroy(GtkWidget *widget);

Эта функция объявлена в файле gtk/gtkwidget.h. При уничтожении виджита также уничтожаются все его дочерние виджиты.

Если вы освобождаете виджит из контейнера функцией:

void gtk_container_remove(GtkContainer *cont, GtkWidget *w);

то виджит также будет разрушен.

Иногда нужно переместить виджит из одного контейнера в другой без его уничтожения. Это можно сделать так (мы будем перемещать надпись):

gtk_widget_ref(GTK_WIDGET(label));

gtk_container_remove(GTK_CONTAINER(cont1), label);

gtk_container_add(GTK_CONTAINER(cont2), label);

«Спрятать» виджит можно с помощью функции

void gtk_widget_hide(GtkWidget *w);

Отобразить виджит снова поможет функция gtk_widget_show.

Виджит может находиться в одном из состояний:

♦ GTK_STATE_NORMAL — нормальное;

♦ GTK_STATE_ACTIVE — активное (например, нажата кнопка);

♦ GTK_STATE_PRELIGTH — над виджитом находится указатель мыши;

♦ GTK_STATE_SELECTED — виджит выбран (установлен фокус ввода);

♦ GTK_STATE_INSENSITIVE — виджит не реагирует на ввод (сигналы).

Определить состояние виджита можно так:

GTK_WIDGET(w)->state

или с помощью макроса:

GTK_WIDGET_STATE(wid)

описанного в файле gtk/gtkwidget.h.

Сделать виджит неактивным можно так:

gtk_widget_set_sensitive(widget, FALSE);

Если второй параметр функции gtk_widget_set_sensitive будет равен TRUE, виджит widget станет активным.

Чтобы наш виджит получил фокус ввода, нужно использовать функцию:

gtk_widget_grab_focus(widget);

23.4.2. Упаковка виджитов, поля ввода и кнопки

Для размещения (упаковки) виджита в окне используются контейнеры. Существуют два основных вида контейнеров. Первый вид в качестве прародителя использует объект класса GtkBin, а второй — объект класса GtkContainer. Контейнеры первого вида могут иметь только один дочерний виджит, поэтому они используются для создания специфических интерфейсов: одной кнопки, рамки, окна.

Контейнеры второго вида более функциональны — они могут иметь много дочерних виджитов. Чаще всего используются контейнеры:

♦ GtkHBox — позволяет размещать виджиты горизонтально;

♦ GtkVBox — используется для вертикального размещения виджитов;

♦ GtkFixed —

позволяет размещать виджиты в фиксированных координатах;

♦ GtkTable — позволяет упаковывать виджиты в виде таблицы.

Наиболее удачным, на мой взгляд, является контейнер GtkTable, поэтому в этом параграфе мы рассмотрим именно его. GtkTable может с успехом заменить и горизонтальный, и вертикальный контейнеры — что нам стоит задать таблицу, состоящую или одной строки или одного столбца?

Кроме контейнера GtkTable, в этом параграфе будут рассмотрены:

♦ поля для ввода текста и обработка введенной информации;

♦ кнопки;

♦ файловый ввод/вывод.

Сейчас мы напишем небольшой конфигуратор, который будет вносить изменения в файл

/etc/resolv.conf
. Напомню вам формат этого файла:

domain firma.ru

nameserver 192.168.0.1

nameserver 192.168.0.2

Директива domain определяет наш домен, а две директивы nameserver — первый и второй DNS-серверы, соответственно. Наш конфигуратор не будет вносить изменения в настоящий файл

/etc/resolv.conf
— для этого нужны права суперпользователя. При желании можно будет потом скопировать файл
resolv.conf
, сгенерированный нашей программой, в каталог
/etc
.

На рисунке 23.2 изображена уже готовая программа. Работает она так. Когда пользователь введет что-нибудь в поле ввода и нажмет Enter, программа отобразит введенный им текст на консоли. Когда пользователь нажмет OK, введенная им информация будет еще раз выведена на консоль и записана в файл. При нажатии кнопки Quit программа завершит свою работу. Она должна также завершить работу при нажатии кнопки закрытия окна — в GTK программист сам определяет реакции на стандартные кнопки.

Рис. 23.3. Учебный конфигуратор

Как видно из рисунка, нам понадобятся три поля ввода, три надписи и две кнопки. Поля ввода мы будем хранить в массиве:

GtkWidget *edit[3];

Создать поле для ввода можно с помощью функции gtk_entry_new:

edit[i] = gtk_entry_new;

После создания поля необходимо вызвать функцию gtk_entry_set_editable, иначе пользователь ничего не сможет ввести в это поле.

gtk_entry_set_editable(GTK_ENTRY(edit[i]), 1);

Ну и, само собой разумеется, нужно установить реакцию на нажатие клавиши Enter — сигнал activate:

gtk_signal_connect(GTK_OBJECT(edit[i]), "activate",

GTK_SIGNAL_FUNC(enter_callback), edit[i]);

Весьма желательно на этапе отладки программы видеть введенную информацию на консоли. Для этого нужно написать такую функцию enter_callback, которая выводила бы содержимое поля на консоль. Получить введенную пользователем информацию очень легко:

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

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

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

Седина в бороду, Босс… вразнос!

Трофимова Любовь
Юмор:
юмористическая проза
5.00
рейтинг книги
Седина в бороду, Босс… вразнос!

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Изгой Проклятого Клана. Том 5

Пламенев Владимир
5. Изгой
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 5

Звездная Кровь. Экзарх I

Рокотов Алексей
1. Экзарх
Фантастика:
боевая фантастика
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Экзарх I

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Путь к бессмертию 1

Покинтелица Евгений
1. Девятихвостый Богатырь
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Путь к бессмертию 1

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6