Linux: Полное руководство
Шрифт:
Если второй параметр функции 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, которая выводила бы содержимое поля на консоль. Получить введенную пользователем информацию очень легко:Реакция на нажатие кнопки OK будет следующей:
Если ваше окно должно содержать много надписей, то я рекомендую вам поступать так: объявить всего одну переменную, затем создать надпись, поместить ее в контейнер, затем опять создать надпись с использованием этой же переменной, поместить ее в контейнер и т.д. Примерно так:
Листинг 23.6 содержит полный код конфигуратора Resolver.
Листинг 23.6. Файл resolver.c