Рейтинговые книги
Читем онлайн Linux: Полное руководство - Денис Колисниченко

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 128 129 130 131 132 133 134 135 136 ... 158

 /* О координатах ячеек поговорим после этого листинга */

 gtk_table_attach_defaults(GTK_TABLE(table),

  label, 0, 1, 0, 1);

 gtk_widget_show(label);

 label = gtk_label_new("DNS #1: ");

 gtk_table_attach_defaults(GTK_TABLE(table),

  label, 0, 1, 1, 2);

 gtk_widget_show(label);

 label = gtk_label_new("DNS #2: ");

 gtk_table_attach_defaults(GTK_TABLE(table),

  label, 0, 1, 2, 3);

 gtk_widget_show (label);

 /* Заполняем наш массив полей ввода. По аналогии с Delphi,

  я назвал массив edit[]*/

 for (i=0; i<3; i++) {

  /* Новое поле */

  edit[i] = gtk_entry_new();

  /* Если забыть этот оператор, пользователь ничего не

   сможет ввести */

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

  /* Определяем одну для всех реакцию на сигнал activate -

   нажатие Enter*/

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

   GTK_SIGNAL_FUNC(enter_callback), edit[i]);

  /* Помещаем edit[i] в таблицу */

  gtk_table_attach_defaults (GTK_TABLE(table),

   edit[i], 1, 2, i, i+1);

  /* Показываем */

  gtk_widget_show(edit[i]);

 }

 /* Создаем кнопку "OK", помещаем в таблицу,

  определяем реакцию на нажатие и показываем */

 button = gtk_button_new_with_label("OK");

 gtk_table_attach_defaults(GTK_TABLE(table),

  button, 2, 3, 0, 1);

 gtk_signal_connect(GTK_OBJECT(button), "clicked",

  GTK_SIGNAL_FUNC(writetofile), NULL);

 gtk_widget_show(button);

 /* То же самое для кнопки Quit */

 button = gtk_button_new_with_label("Quit");

 gtk_table_attach_defaults(GTK_TABLE(table),

  button, 2, 3, 2, 3);

 gtk_signal_connect(GTK_OBJECT(button),"clicked",

  GTK_SIGNAL_FUNC(delete_event), NULL);

 gtk_widget_show(button);

 gtk_widget_show(table); /* Показываем таблицу */

 gtk_widget_show(window); /* Показываем окно */

 /* Запускаем GTK-программу */

 gtk_main();

 return 0;

}

Я старался писать подробные комментарии, но все же кое-что осталось в тумане. Это координаты ячеек. Рассмотрим нашу таблицу 3×3:

table = gtk_table_new(3, 3, TRUE);

0      1    2  3

 Domain Поле OK

1

 DNS1   Поле

2

 DNS2   Поле Quit

3

Сначала указываются координаты по X, затем — по Y. Вот координаты кнопки OK: 2, 3, 0, 1. Это означает, что кнопка будет расположена в последнем столбце (между 2 и 3), но в первой строке (между 0 и 1).

gtk_table_attach_defaults(GTK_TABLE(table), button,

 2, 3, 0, 1);

Подробнее рассматривать контейнер GtkTable я не вижу смысла: основные операции, я думаю, вам понятны — это создание таблицы с указанием ее размерности и добавление в таблицу виджита функцией gtk_table_attach_defaults(). Еще раз напомню о необходимости отображения виджитов, помещенных в таблицу, и самой таблицы:

gtk_widget_show (table);

Теперь откомпилируем нашу программу:

$ gcc resolv.с -о resolv `gtk-config --cflags` `gtk-config --libs`

Программа gtk-config сообщает компилятору всю необходимую информацию о библиотеке GTK.

Обратите внимание на директиву

#include <gtk/gtk.h>

Обычно файлы заголовков GTK находятся в другом каталоге, например, gtk-1.2, но это не имеет значения — все необходимые параметры укажет программа gtk-config.

В заключение этого пункта перечислим события, характерные для кнопок (таблица 23.3).

События кнопок Таблица 23.3

Событие Описание clicked Щелчок pressed Кнопка нажата мышью (и пока не отпущена) released Кнопка отпущена enter Указатель мыши в пределах кнопки leave Указатель мыши вышел за пределы кнопки

23.4.3. Переключатели

Переключатели бывают двух типов: зависимые (radio buttons) и независимые (checkbuttons). Переключатели являются кнопками, поэтому для них характерны те же события, что и для кнопок.

Начнем с независимых переключателей, так как они проще в реализации. Создать такой переключатель можно с помощью одной из функций:

GtkWidget *gtk_check_button_new(void);

GtkWidget *gtk_check_button_new_with_label(gchar * label);

Первая создает переключатель без надписи (если вы хотите указать надпись отдельно), а вторая — с надписью, которая обычно отображается справа от переключателя. Затем нужно, как всегда, поместить виджиты в контейнер и отобразить.

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

GtkWidget *gtk_radio_button_new(GSList *group);

GtkWidget *gtk_radio_button_new_with_label(GSList *group,

 gchar *label);

Параметр group указывает на принадлежность переключателя к группе. В пределах группы активным может быть только один переключатель. Группу можно создать функцией:

GSList *gtk_radio_button_group(

 GtkRadioButton *radio_button);

Однако существует другой способ, позволяющий обойтись без переменной группы — так мы сэкономим память, если групп много:

button2 = gtk_radio_button_new_with_label(

 gtk_radio_button_group(GTK_RADIO_BUTTON(button1)),

 "button2");

С помощью функции

void gtk_toggle_button_set_active(

 GtkToggleButton *toggle_button, gint state);

можно сделать одну из кнопок активной.

Следующий листинг демонстрирует работу с тремя зависимыми переключателями и вертикальным контейнером GtkVBox.

Листинг 23.7. Зависимые переключатели

#include <gtk/gtk.h>

#include <glib.h>

gint close_application( GtkWidget *widget,

GdkEvent * event, gpointer data) {

 gtk_main_quit();

 return(FALSE);

}

int main(int argc, char *argv[]) {

 GtkWidget *window = NULL;

 GtkWidget *box1;

 GtkWidget *box2;

 GtkWidget *button;

 GtkWidget *separator;

 GSList *group;

 gtk_init(&argc,&argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window), "delete_event",

 GTK_SIGNAL_FUNC(close_application), NULL);

 gtk_window_set_title(GTK_WINDOW(window),

  "Выберите дистрибутив");

 gtk_container_set_border_width(GTK_CONTAINER(window), 0);

 box1 = gtk_vbox_new(FALSE, 0);

 gtk_container_add(GTK_CONTAINER(window), box1);

 gtk_widget_show(box1);

 box2 = gtk_vbox_new(FALSE, 10);

 gtk_container_set_border_width(GTK_CONTAINER (box2), 10);

 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);

 gtk_widget_show(box2);

 button = gtk_radio_button_new_with_label(NULL, "Red Hat");

 gtk_box_pack_start(GTK_BOX(box2), button,

  TRUE, TRUE, 0);

 gtk_widget_show(button);

 group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));

 button =

  gtk_radio_button_new_with_label(group, "Mandrake");

 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),

  TRUE);

 gtk_box_pack_start(GTK_BOX(box2), button,

  TRUE, TRUE, 0);

 gtk_widget_show(button);

 button = gtk_radio_button_new_with_label(

  gtk_radio_button_group(GTK_RADIO_BUTTON(button)),

  "ALT Linux");

 gtk_box_pack_start(GTK_BOX(box2), button,

  TRUE, TRUE, 0);

 gtk_widget_show(button);

 separator = gtk_hseparator_new();

 gtk_box_pack_start(GTK_BOX(box1), separator,

  FALSE, TRUE, 0);

 gtk_widget_show(separator);

 box2 = gtk_vbox_new(FALSE, 10);

 gtk_container_set_border_width(GTK_CONTAINER(box2), 10);

 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, TRUE, 0);

 gtk_widget_show(box2);

 button = gtk_button_new_with_label("OK");

 gtk_signal_connect_object(GTK_OBJECT (button),

  "clicked", GTK_SIGNAL_FUNC(close_application),

  GTK_OBJECT(window));

 gtk_box_pack_start(GTK_BOX (box2), button,

  TRUE, TRUE, 0);

 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);

 gtk_widget_grab_default(button);

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return(0);

}

Рис. 23.4. Зависимые переключатели

23.4.4. Список

Виджит CList представляет собой список, состоящий из нескольких колонок. Ячейки такого списка могут содержать текстовые значения. Мы можем обратиться отдельно к каждой ячейке списка. Создать список можно одной из функций:

GtkWidget *gtk_clist_new(gint columns);

GtkWidget *gtk_clist_new_with_titles(gint columns,

 gchar *titles[]);

Первая функция создает список без заголовков, а вторая с заголовками. Параметр columns задает число колонок.

Добавить элемент в список позволяют функции:

gint gtk_clist_prepend(GtkCList *clist, gchar *text[]);

gint gtk_clist_append(GtkCList *clist, gchar *text[]);

1 ... 128 129 130 131 132 133 134 135 136 ... 158
На этой странице вы можете бесплатно читать книгу Linux: Полное руководство - Денис Колисниченко бесплатно.
Похожие на Linux: Полное руководство - Денис Колисниченко книги

Оставить комментарий