Linux: Полное руководство
Шрифт:
Конечно, значение локали у вас может быть другим. Эту функцию нужно вызвать ДО инициализации GTK+.
Рис. 23.2. Надпись
23.4. Виджиты
23.4.1. Рождение, смерть и состояния виджита
После создания виджита управление ресурсами и памятью, необходимыми ему, выполняется автоматически. Виджиты
Эта функция объявлена в файле gtk/gtkwidget.h. При уничтожении виджита также уничтожаются все его дочерние виджиты.
Если вы освобождаете виджит из контейнера функцией:
то виджит также будет разрушен.
Иногда нужно переместить виджит из одного контейнера в другой без его уничтожения. Это можно сделать так (мы будем перемещать надпись):
«Спрятать» виджит можно с помощью функции
Отобразить виджит снова поможет функция gtk_widget_show.
Виджит может находиться в одном из состояний:
♦ GTK_STATE_NORMAL — нормальное;
♦ GTK_STATE_ACTIVE — активное (например, нажата кнопка);
♦ GTK_STATE_PRELIGTH — над виджитом находится указатель мыши;
♦ GTK_STATE_SELECTED — виджит выбран (установлен фокус ввода);
♦ GTK_STATE_INSENSITIVE — виджит не реагирует на ввод (сигналы).
Определить состояние виджита можно так:
или с помощью макроса:
описанного в файле gtk/gtkwidget.h.
Сделать виджит неактивным можно так:
Если второй параметр функции gtk_widget_set_sensitive будет равен TRUE, виджит widget станет активным.
Чтобы наш виджит получил фокус ввода, нужно использовать функцию:
23.4.2. Упаковка виджитов, поля ввода и кнопки
Для размещения (упаковки) виджита в окне используются контейнеры. Существуют два основных вида контейнеров. Первый вид в качестве прародителя использует объект класса GtkBin, а второй — объект класса GtkContainer. Контейнеры первого вида могут иметь только один дочерний виджит, поэтому они используются для создания специфических интерфейсов: одной кнопки, рамки, окна.
Контейнеры второго вида более функциональны — они могут иметь много дочерних виджитов. Чаще всего используются контейнеры:
♦ GtkHBox — позволяет размещать виджиты горизонтально;
♦ GtkVBox — используется для вертикального размещения виджитов;
♦ GtkFixed —
♦ GtkTable — позволяет упаковывать виджиты в виде таблицы.
Наиболее удачным, на мой взгляд, является контейнер GtkTable, поэтому в этом параграфе мы рассмотрим именно его. GtkTable может с успехом заменить и горизонтальный, и вертикальный контейнеры — что нам стоит задать таблицу, состоящую или одной строки или одного столбца?
Кроме контейнера GtkTable, в этом параграфе будут рассмотрены:
♦ поля для ввода текста и обработка введенной информации;
♦ кнопки;
♦ файловый ввод/вывод.
Сейчас мы напишем небольшой конфигуратор, который будет вносить изменения в файл
Директива domain определяет наш домен, а две директивы nameserver — первый и второй DNS-серверы, соответственно. Наш конфигуратор не будет вносить изменения в настоящий файл
На рисунке 23.2 изображена уже готовая программа. Работает она так. Когда пользователь введет что-нибудь в поле ввода и нажмет Enter, программа отобразит введенный им текст на консоли. Когда пользователь нажмет OK, введенная им информация будет еще раз выведена на консоль и записана в файл. При нажатии кнопки Quit программа завершит свою работу. Она должна также завершить работу при нажатии кнопки закрытия окна — в GTK программист сам определяет реакции на стандартные кнопки.
Рис. 23.3. Учебный конфигуратор
Как видно из рисунка, нам понадобятся три поля ввода, три надписи и две кнопки. Поля ввода мы будем хранить в массиве:
Создать поле для ввода можно с помощью функции gtk_entry_new:
После создания поля необходимо вызвать функцию gtk_entry_set_editable, иначе пользователь ничего не сможет ввести в это поле.
Ну и, само собой разумеется, нужно установить реакцию на нажатие клавиши Enter — сигнал activate:
Весьма желательно на этапе отладки программы видеть введенную информацию на консоли. Для этого нужно написать такую функцию enter_callback, которая выводила бы содержимое поля на консоль. Получить введенную пользователем информацию очень легко: