Этот метод является наиболее гибким. Пространство родительского контейнера (чаще всего окна, или формы, как я привык называть этот виджет) заполняется псевдокоординатами, рядами и колонками... Например, вот пример таблицы:
0 1 2 3 5 0+----+----+----+----+ | | | | | 1+----+----+----+----+ | | | | | 2+----+----+----+----+
Здесь видно, что, как это принято, координаты начинаются с (0;0) левого верхнего угла таблицы.
Для создания таблицы используется функция:
GtkWidget *gtk_table_new( gint rows, gint columns, gint homogeneous );
Первый и второй аргументы дожны быть и так понятны :)). Третий аргумент имеет следущий смысл - если он равен TRUE, то ячейки таблицы увеличиваются в соответствии с размером самого большого виджета в таблица. Иначе, для каджого ряда ширина будет равна маскимальной высоте содержащихся в нем виджетов, а для каждого столбца ширина - максимальной шириной виджетов.
Для добавления виджетов в таблицу используется следующая функция:
void gtk_table_attach( GtkTable *table, //собственно наша таблица GtkWidget *child, //добавляемый виджет gint left_attach, /x-координата левой верхней точки зацепления gint right_attach, //x-координата правой нижней точки зацепления gint top_attach, //y-координата левой верхней точки зацепления gint bottom_attach, //y-координата правой нижней точки зацепления gint xoptions, //опции заполнения по горизонтали gint yoptions, //опции заполнения по вертикали gint xpadding, //отступ по горизонтали gint ypadding ); //отступ по вертикали
Чуть подробнее про опции заполнения. Они могут принимать следующие значения:
Опции могут использоваться одновременно с помощью побитового OR, например GTK_FILL | GTK_EXPAND. Надо помнить, что эти опции используются именно в контексте для X или Y. И относятся они только к соотвественным координатам.
В качестве сокращенного варианта используется следующий:
void gtk_table_attach_defaults( GtkTable *table, GtkWidget *widget, gint left_attach, gint right_attach, gint top_attach, gint bottom_attach );
Все то же самое, что и впредыдущей функции, но опции установлены в GTK_FILL | GTK_EXPAND, и отступ равен 0.
Еще функции позволяют установить расстояние между рядами и столбцами соотвественно. Вот они:
void gtk_table_set_row_spacing( GtkTable *table, gint row, gint spacing ); void gtk_table_set_col_spacing ( GtkTable *table, gint column, gint spacing ); void gtk_table_set_row_spacings( GtkTable *table, gint spacing ); void gtk_table_set_col_spacings( GtkTable *table, gint spacing );
Первая пара устанавливает пробелы для каждого столбца и ряда отдельно, вторая для всех сразу. Надо сказать, что для ряда пробел устанавливается под ним, а для столбца с левой стороны.
Теоретическая подготовка дана... В следующем шаге рассмотрим пример рабочей программы.