23.4.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[]);

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

void gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]);

Она позволяет вставить новый элемент в строку row. Нумерация строк списка начинается с 0.

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

void gtk_clist_remove(GtkCList *clist, gint row);

void gtk_clist_clear(GtkCList *clist);

Первая удаляет строку row, а вторая очищает весь список.

Рассмотрим листинг 23.8, в котором демонстрируется работа со списком CList. Программа снабжена подробными комментариями, поэтому рекомендую внимательно читать исходный код.

Листинг 23.8. Применение виджита CList

#include <gtk/gtk.h>

/* Нужен для функции setlocale() */

#include <locale.h>

/* Добавляет список - обработчик кнопки Добавить */

void button_add_clicked(gpointer data) {

 int indx;

 /* Простой список */

 gchar *dist[4][2] = { { "1", "Red Hat Linux" },

  { "2", "Mandrake Linux" },

  { "3", "ALT Linux" },

  { "4", "ASP Linux" } };

 for(indx=0; indx < 4; indx++)

  gtk_clist_append((GtkCList *) data, dist[indx]);

 return;

}

/* Обработчик нажатия кнопки Очистить */

void button_clear_clicked(gpointer data) {

 /* Очищаем список */

 gtk_clist_clear((GtkCList *)data);

 return;

}

/* Функция прячет/отображает заголовки */

void button_hide_show_clicked(gpointer data) {

 /* 0 = сейчас видим заголовки */

 static short int flag = 0;

 if (flag == 0) {

  /* прячем заголовки */

  gtk_clist_column_titles_hide((GtkCList *)data);

  flag++;

 } else {

  /* Отображаем заголовки */

  gtk_clist_column_titles_show((GtkCList *)data);

 }

 return;

}

/* Данная функция будет вызвана, если пользователь выберет

 элемент */

void selection_made(GtkWidget *clist, gint row,

 gint column, GdkEventButton *event, gpointer data) {

 gchar *text;

 /* Получаем выбранный текст (элемент списка) */

 gtk_clist_get_text(GTK_CLIST(clist), row, column, &text);

 /* Просто выводим информацию на консоль */

 g_print(

  "Вы выбрали ряд %d. Колонка %d, текст в ячейке %s ",

  row, column, text);

 return;

}

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

 GtkWidget *window;

 GtkWidget *vbox, *hbox;

 GtkWidget *scrolled_window, *clist;

 GtkWidget *button_add, *button_clear, *button_hide_show;

 gchar *titles[2] = { "Номер", "Дистрибутив" };

 setlocale(LC_ALL, "ru_RU.KOI8-R");

 // Нужно вызвать ДО gtk_init()

 gtk_init(&argc, &argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_set_usize(GTK_WIDGET(window), 300, 150);

 gtk_window_set_title(GTK_WINDOW(window), "Список");

 gtk_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

 vbox=gtk_vbox_new(FALSE, 5);

 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);

 gtk_container_add(GTK_CONTAINER(window), vbox);

 gtk_widget_show(vbox);

 /* Создаем окно с полосками прокрутки и упаковываем в

  него список */

 scrolled_window = gtk_scrolled_window_new(NULL, NULL);

 gtk_scrolled_window_set_policy(

  GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC,

  GTK_POLIСY_ALWAYS);

 gtk_box_pack_start(GTK_BOX(vbox), scrolled_window,

  TRUE, TRUE, 0);

 gtk_widget_show(scrolled_window);

 /* Создаем список с двумя колонками */

 clist = gtk_clist_new_with_titles(2, titles);

 /* Обработка выделения */

 gtk_signal_connect(GTK_OBJECT(clist), "select_row",

  GTK_SIGNAL_FUNC(selection_made), NULL);

 /* Устанавливаем тень для рамки списка */

 gtk_clist_set_shadow_type(GTK_CLIST(clist),

  GTK_SHADOW_OUT);

 /* Устанавливаем ширину для колонки. Колонки нумеруются

  с 0 */

 gtk_clist_set_column_width(GTK_CLIST(clist), 0, 150);

 /* Помещаем список в контейнер */

 gtk_container_add(GTK_CONTAINER(scrolled_window), clist);

 gtk_widget_show(clist);

 /* Создаем и размещаем кнопки Добавить список,

  Очистить, Спрятать/отобразить заголовок */

 hbox = gtk_hbox_new(FALSE, 0);

 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);

 gtk_widget_show(hbox);

 button_add = gtk_button_new_with_label("Добавить");

 button_clear = gtk_button_new_with_label("Очистить");

 button_hide_show = gtk_button_new_with_label("Спрятать/отобразить");

 gtk_box_pack_start(GTK_BOX(hbox), button_add,

  TRUE, TRUE, 0);

 gtk_box_pack_start(GTK_BOX(hbox), button_clear,

  TRUE, TRUE, 0);

 gtk_box_pack_start(GTK_BOX(hbox), button_hide_show,

  TRUE, TRUE, 0);

 /* Связываем обработчики */

 gtk_signal_connect_object(GTK_OBJECT(button_add),

  "clicked",

  GTK_SIGNAL_FUNC(button_add_clicked), (gpointer) clist);

  gtk_signal_connect_object(GTK_OBJECT(button_clear),

  "clicked",

  GTK_SIGNAL_FUNC(button_clear_clicked),(gpointer)clist);

 gtk_signal_connect_object(GTK_OBJECT(button_hide_show),

  "clicked", GTK_SIGNAL_FUNC(button_hide_show_clicked),

  (gpointer)clist);

 gtk_widget_show(button_add);

 gtk_widget_show(button_clear);

 gtk_widget_show(button_hide_show);

 gtk_widget_show(window);

 gtk_main();

 return(0);

}

Программа работает так: при нажатии кнопки Добавить создается список, состоящий из названий четырех популярных дистрибутивов Linux. Кнопка Очистить очищает список, а Спрятать/отобразить прячет или отображает заголовки списка. При щелчке на определенной ячейке списка на консоль выводится соответствующее сообщение — координаты ячейки и ее текст.

Рис 23.5.

< … стр. 639–640 … >

void destroy(GtkWidget *widget, gpointer data);

static void button_click(GtkWidget *widget, gpointer data);

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

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *label;

 w_ctrl ctrl;

 gchar *caption;

 setlocale(LC_ALL, "ru_RU.KOI8-R");

 caption = g_strdup_printf("Доброго времени суток!");

 gtk_init(&argc, &argv);

 window = gtk_window_new( GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window), "delete_event",

  GTK_SIGNAL_FUNC(delete_event), NULL);

 gtk_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(destroy), &ctrl);

 gtk_window_set_title(GTK_WINDOW(window), caption);

 gtk_container_set_border_width(GTK_CONTAINER(window), 10);

 button = gtk_button_new();

 label = gtk_label_new(" -== Нажмите кнопку ==- " );

 ctrl.app_window = window;

 ctrl.label = label;

 gtk_container_add(GTK_CONTAINER(button), label);

 gtk_container_add(GTK_CONTAINER(window), button);

 gtk_signal_connect(GTK_OBJECT(button), "clicked",

  GTK_SIGNAL_FUNC(button_click), &ctrl);

 gtk_widget_show_all(window);

 gtk_main();

 return(0);

}

// ****************************************************

void quit_confirm(GtkWidget *widget) {

 GtkWidget *quit_form;

 GtkWidget *label;

 GtkWidget *yes_button, *no_button;

 quit_form = gtk_dialog_new();

 gtk_window_set_position(GTK_WINDOW(quit_form),

  GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(quit_form),

  10);

 label =

  gtk_label_new(" Вы действительно хотите выйти? *);

 yes_button = gtk_button_new_with_label("Да");

 no_button = gtk_button_new_with_label("Нет");

 gtk_signal_connect_object(GTK_OBJECT(yes_button),

  "clicked",

  GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)widget);

 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), yes_button);

 gtk_signal_connect_object(GTK_OBJECT(no_button),

  "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),

  (gpointer)quit_form);

 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), no_button);

 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->vbox), label);

 gtk_window_set_modal(GTK_WINDOW(quit_form), TRUE);

 gtk_widget_show_all(quit_form);

}

gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 quit_confirm(widget);

 return(TRUE);

}

void destroy(GtkWidget *widget, gpointer data) {

 printf{"GOOD-BYE!");

 gtk_main_quit();

}

static void button_click(GtkWidget *widget,

 gpointer data ) {

 static gint i = 0;

 GtkWidget *app_window;

 GtkWidget *label;

 gchar msg[256];

 app_window = GTK_WIDGET(((w_ctrl *)data)->app_window);

 label = GTK_WIDGET(((w_ctrl*)data)->label);

 i++;

 sprintf(msg, "Вы нажали кнопку: %d раз(а)", i);

 gtk_label_set_text(GTK_LABEL(label), msg);

}

Думаю, текст программы ясен без лишних комментариев. Нужно лишь пояснить один очень важный момент. Обратите внимание на то, что мы переопределили обработчик для события delete_event.

gtk_signal_connect(GTK_OBJECT(window), "delete_event",

 GTK_SIGNAL_FUNC(delete_event), NULL);

gtk_signal_connect(GTK_OBJECT(window), "destroy",

 GTK_SIGNAL_FUNC(destroy), &ctrl);

Если данный обработчик возвращает FALSE, то будет вызвана функция destroy(), которая уничтожит окно. Мы переписали функцию delete_event() так, чтобы она всегда возвращала TRUE, то есть функция destroy() вообще не будет вызвана. Но в таком случае наше окно вообще никогда не закроется, поэтому нужно, чтобы кто-то позаботился о закрытии окна. Это будет функция quit_confirm(), отображающая диалог завершения работы.

gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 quit_confirm(widget);

 return(TRUE);

}

Рис. 23.6. Программа только запущена

Рис. 23.7. Пользователь нажал на кнопку 4 раза

Рис. 23.8. Диалог завершения работы

Теперь рассмотрим обработчики событий кнопок Да и Нет диалога:

gtk_signal_connect_object(GTK_OBJECT(yes_button),

 "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),

 (gpointer)widget);

gtk_signal_connect_object(GTK_OBJECT(no_button), "clicked",

 GTK_SIGNAL_FUNC(gtk_widget_destroy),(gpointer)quit_form);

Кнопка yes_button вызывает функцию gtk_widget_destroy() и передает ей параметр (gpointer)widget, то есть уничтожает главное окно приложения, а кнопка no_button передает функции gtk_widget_destroy() параметр (gpointer)quit_form. который указывает на окно диалога, то есть при нажатии этой кнопки будет закрыто само окно нашего диалога.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

8.6.1 Список Инициализаторов

Из книги C++ автора Хилл Мюррей

8.6.1 Список Инициализаторов Когда описанная переменная является составной (класс или массив), то инициализатор может состоять из заключенного в фигурные скобки, разделенного запятыми списка инициализаторов для членов составного объекта, в порядке возрастания индекса


Список терминов

Из книги Как найти высокооплачиваемую работу с помощью Internet автора Рудинштейн Марк


Список каналов

Из книги Компьютер + TV: телевидение на ПК автора Гольцман Виктор Иосифович

Список каналов Список каналов – одна из самых важных частей программы, так как работа со списком во многом определяет, насколько удобно будет работать с приложением. Необходимо отметить, что в программе FlyDS работа со списком реализована с помощью контекстного меню,


1.10. Список литературы

Из книги Реферат, курсовая, диплом на компьютере автора Баловсяк Надежда Васильевна

1.10. Список литературы Важность правильного оформления списка литературы переоценить сложно. Этот, на первый взгляд, небольшой раздел сразу привлекает внимание руководителей и проверяющих работы. Поэтому советую отнестись к созданию и оформлению перечня использованных


Контрольный список

Из книги Facebook: как найти 100 000 друзей для вашего бизнеса бесплатно автора Албитов Андрей

Контрольный список Итак, вы узнали, как собрать 100 000 друзей на вашу страницу Facebook. Пора за работу! Вот список задач, которые вам предстоит решить:– Создать страницу на Facebook (если нет).Это сделать легко, зайдите на Facebook.com. Если есть вопросы, прочитайте раздел «Помощь». От


СПИСОК ЛІТЕРАТУРИ

Из книги Вступ до інженерії програмного забезпечення автора Сидоров М. О.

СПИСОК ЛІТЕРАТУРИ 1. Basilli V.R. Viewing Maintenance as Reuse-Oriented Software Development/V.R. Basilli //IEEE Software. 1990. - June. -P. 19-25.2. Boehm B.W. Improving Software Productivity / B.W. Boehm // Computer. - 1987. - Vol. 20, n.9. - P. 43 - 57.3. Boehm B.W. Software Engineering Economics / B.W. Boehm - Englewood Cliffs, Ш.: Prentice-Hall, 1981. - 257 p.4. Boehm B.W. Spiral Model of software Development and Enhancement / B.W. Boehm // Computer. - 1988, - May. - P.


9.3.4. Список контактов

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

9.3.4. Список контактов Skype — это не только виртуальный телефон. Щелкните на контакте правой кнопкой, и вы увидите дополнительные возможности Skype (рис. 9.38). Вы можете:? Начать Чат — Skype позволяет заменить сервисы обмена короткими сообщениями вроде ICQ. Да, вы можете не только


Список литературы

Из книги КОМПАС-3D для студентов и школьников. Черчение, информатика, геометрия автора Большаков Владимир

Список литературы 1. Анрах Дж. Т. Удивительные фигуры: оптические иллюзии, поражающие воображение / Пер. с англ. Т. С. Курносенко. М.: ООО «Издательство АСТ»: ООО «Издательство Астрель», 2002. — 125 с.2. Баранова И. В. КОМПАС-3В для школьников. Черчение и компьютерная графика.


Список литературы

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Список литературы Ниже приведен список литературы, которая использовалась при написании этой книги. Некоторые из указанных работ имеют исключительно большое значение - без них я не смог бы разобраться в некоторых алгоритмах и пояснить их читателям применительно к Delphi.


1.10. Список литературы

Из книги Видеосамоучитель создания реферата, курсовой, диплома на компьютере автора Баловсяк Надежда Васильевна

1.10. Список литературы Составление списка литературы – важный этап в написании работы. Этот небольшой раздел сразу привлекает внимание проверяющих. Поэтому рекомендуется отнестись к созданию и оформлению перечня использованных источников особо тщательно.Список


3. Список

Из книги Инфобизнес за один день автора Ушанов Азамат

3. Список «10 способов, как сделать то-то», «17 секретов, как добиться успеха», «Пять способов, как избежать неудачи» – статья, видеоурок или скрин-каст. Это делается легко, потому что любой вопрос можно разбить на несколько частей, секретов, фишек и технологий, и описать их в


4.3.2. Черный список

Из книги Анонимность и безопасность в Интернете. От «чайника» к пользователю автора Колисниченко Денис Николаевич

4.3.2. Черный список Иногда возникает ситуация, когда вы не хотите больше получать письма от кого-либо из отправителей. Речь не о спаме, просто испортились отношения. Тогда можно добавить этого отправителя в черный список. Рассмотрим, как это сделать в веб-интерфейсе сервиса


Список кораблей

Из книги Домены. Все, что нужно знать о ключевом элементе Интернета автора Венедюхин Александр

Список кораблей Едва ли не каждого, кто хоть как-то связан по роду деятельности с Интернетом, занимал вопрос: что за путь изберут для запуска открытой регистрации?Кириллический домен с самого начала проектировали как домен, получить имя в котором сможет каждый.Обсуждение


Список типов .NET

Из книги автора

Список типов .NET * Целые типы Вещественные типы Логический тип Символьный тип Перечислимый и диапазонный типы Статические массивы Динамические массивы Записи Множества Файлы Указатели Процедурный тип Последовательности