- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
Для создания объекта типа GtkAdjustment передайте в функцию нижнюю и верхнюю границы и размер приращения.
GtkObject* gtk_adjustment_new(gdouble value, gdouble lower,
gdouble upper, gdouble step_increment,
gdouble page_increment, gdouble page_size);
Значения параметров step_increment и page_increment задают величину минимального и максимального приращений, В случае кнопки-счетчика GtkSpinButton параметр step_increment определяет, насколько изменится значение при щелчке мышью стрелки виджета. Параметры page_increment и page_size в виджетах GtkSpinButton не важны.
Второй параметр, climb_rate, функции gtk_spin_button_new управляет скоростью прокрутки значений при нажатии и удерживании кнопки со стрелкой. И наконец, параметр digits задает точность представления числового значения, виджета, если, например, digits равен 3, кнопка-счетчик отобразит 0.00.
Функция gtk_spin_button_new_with_range — удобный способ создания объекта GtkAdjustment. Просто задайте нижнюю и верхнюю границы и величину приращения.
Прочесть текущее значение очень легко благодаря функции gtk_spin_button_getvalue, а если вам нужно целое число, можно применить функцию gtk_spin_button_get_value_as_int.
Выполните упражнение 16.5.
Упражнение 16.5. Использование виджета GtkSpinButtonСейчас мы посмотрим в коротком примере, как действует кнопка-счетчик GtkSpinButton. Назовите файл spin.с.
#include <gtk/gtk.h>
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
int main(int argc, char *argv[]) {
GtkWidget* window;
GtkWidget *spinbutton;
GtkObject *adjustment;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);
adjustment = gtk_adjustment_new(100.0, 50.0, 150.0, 0.5, 0.05, 0.05);
spinbutton = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 0.01, 2);
gtk_container_add(GTK_CONTAINER(window), spinbutton);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Когда вы выполните программу, то получите кнопку-счетчик, ограниченную диапазоном значений 50–150 (рис. 16.9).
Рис. 16.9
GtkButton
Вы уже видели виджет кнопки GtkButton в действии, но существует несколько виджетов, потомков GtkButton, с чуть большими функциональными возможностями, заслуживающими упоминания.
GtkButton
+----GtkToggleButton
+----GtkCheckButton
+----GtkRadioButton
Как видно из иерархии виджетов, кнопка-переключатель типа GtkToggleButton — прямой потомок кнопки GtkButton, кнопка-флажок GtkCheckButton — кнопки-выключателя GtkToggleButton и то же самое для переключателя GtkRadioButton, причем каждый дочерний виджет предназначен для определенных задач.
GtkToggleButtonВиджет GtkToggleButton идентичен виджету GtkButton за исключением одной важной детали: GtkToggleButton обладает состоянием. Это означает, что кнопка-выключатель может быть включена или выключена. Когда пользователь щелкает мышью виджет GtkToggleButton, последний стандартным способом порождает сигнал clicked и изменяет (или "переключает") свое состояние.
API у виджета GtkToggleButton очень простой:
GtkWidget* gtk_toggle_button_new(void);
GtkWidget* gtk_toggle_button_new_with_label(const gchar* label);
gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button);
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button,
gboolean is_active);
Наиболее интересные функции — gtk_toggle_button_get_active и gtk_toggle_button_set_active, которые вы вызываете для чтения и установки состояния кнопки-выключателя. Если характеристика функционирования равна TRUE, это означает, что кнопка-выключатель GtkToggleButton включена.
GtkCheckButtonКнопка-флажок GtkCheckButton — это замаскированная кнопка-выключатель GtkToggleButton. Вместо скучного прямоугольного отображения GtkToggleButton кнопка GtkCheckButton выводится как привлекательный флажок с расположенным рядом текстом. Функциональных различий между ними нет.
GtkWidget* gtk_check_button_new(void);
GtkWidget* gtk_check_button_new_with_label(const gchar *label);
GtkRadioButtonЭта кнопка немного отличается от предыдущих, т.к. может группироваться с другими кнопками того же типа. Переключатель (или радиокнопка) GtkRadioButton — одна из тех кнопок, которые позволяют выбирать только один вариант из группы предложенных. Имя заимствовано у старых радиоприемников с механическими кнопками, которые выскакивали с треском, возвращаясь в прежнее состояние, при нажатии другой кнопки.
GtkWidget* gtk_radio_button_new(GSList *group);
GtkWidget* gtk_radio_button_new_from_widget(GtkRadioButton *group);
GtkWidget* gtk_radio_button_new_with_label(GSList *group, const gchar *label);
void gtk_radio_button_set_group(GtkRadioButton *radio_button, GSList *group);
GSList* gtk_radio_button_get_group(GtkRadioButton *radio_button);
Группа переключателей представлена в объекте-списке библиотеки GLib, названном GSList. Для того чтобы объединить переключатели в группу, вы можете создать объект GSList и затем передать ему каждую кнопку с помощью функций gtk_radio_button_new и gtk_radio_button_get_group, есть и более легкий способ в виде функции gtk_radio_button_new_with_widget, которая включает в GSList существующую кнопку. Вы увидите ее в действии в упражнении 16.6, которое позволит вам опробовать разные кнопки GtkButton.
Упражнение 16.6. GtkCheckButton, GtkToggleButton и GtkRadioButtonВведите следующий текст в файл с именем buttons.с.
1. Сначала объявите указатели на кнопки как глобальные переменные:
#include <gtk/gtk.h>
#include <stdio.h>
GtkWidget *togglebutton;
GtkWidget *checkbutton;
GtkWidget *radiobutton1, *radiobutton2;
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
2. Далее определите вспомогательную функцию, которая упаковывает GtkWidget и GtkLabel в контейнер GtkHbox и затем вставляет этот GtkHbox в заданный виджет- контейнер. Это поможет вам сократить повторяющийся программный код:
void add_widget_with_label(GtkContainer * box, gchar * caption,
GtkWidget * widget) {
GtkWidget *label = gtk_label_new(caption);
GtkWidget *hbox = gtk_hbox_new(TRUE, 4);
gtk_container_add(GTK_CONTAINER(hbox), label);
gtk_container_add(GTK_CONTAINER(hbox), widget);
gtk_container_add(box, hbox);
}
3. print_active — еще одна вспомогательная функция, которая выводит текущее состояние заданной кнопки-выключателя GtkToggleButton со строкой описания. Он вызывается из функции button_clicked, функции обратного вызова, связанной с сигналом clicked кнопки OK. При каждом щелчке мышью этой кнопки вы получаете на экране отчет о состоянии кнопок:
void print_active(char * button_name, GtkToggleButton* button) {
gboolean active = gtk_toggle_button_get_active(button);
printf("%s is %sn", button_name, active?"active":"not active");
}
void button_clicked(GtkWidget *button, gpointer data) {
print_active("Checkbutton", GTK_TOGGLE_BUTTON(checkbutton));
print_active("Togglebutton", GTK_TOGGLE_BUTTON(togglebutton));
print_active("Radiobutton1", GTK_TOGGLE_BUTTON(radiobutton1));
print_active("Radiobutton2", GTK_TOGGLE_BUTTON(radiobutton2));
printf("n");
}
4. В функции main вы создаете виджеты кнопок, поочередно помещаете их в контейнер GtkVBox, добавив пояснительные метки, и связываете сигнал обратного вызова с кнопкой OK:
gint main(gint argc, gchar *argv[]) {
GtkWidget* window;
GtkWidget *button;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);
button = gtk_button_new_with_label("Ok");
togglebutton = gtk_toggle_button_new_with_label("Toggle");
checkbutton = gtk_check_button_new();
radiobutton1 = gtk_radio_button_new(NULL);
radiobutton2 =
gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(radiobutton1));
vbox = gtk_vbox_new(TRUE, 4);
add_widget_with_label(GTK_CONTAINER(vbox), "ToggleButton:",
togglebutton);
add_widget_with_label(GTK_CONTAINER(vbox), "CheckButton:",
checkbutton);
add_widget_with_label(GTK_CONTAINER(vbox), "Radio 1:", radiobutton1);
add_widget_with_label(GTK_CONTAINER(vbox), "Radio 2:", radiobutton2);
add_widget_with_label(GTK_CONTAINER(vbox), "Button:", button);
g_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(button_clicked), NULL);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
На рис. 16.10 показана программа buttons.c в действии с виджетами GtkButton четырех часто применяемых типов.

