вкладки (notebooks)
виджет
вкладки (notebook) - это набор страниц которые
размещаются друг над другом и несут в
себе различную информацию, только одна
страница из набора может быть видима
при просмотре. этот виджет в последнее
время стал очень популярным в gui
programming, с его помощью очень удобно
показывать блоки однотипной информации
разделяя их соответствующим образом.
функция создания:
gtkwidget *gtk_notebook_new( void );
|
существует достаточно
много функций для работы с этим виджетом.
рассмотрим каждую в отдельности ниже.
сначала рассмотрим
индикаторы страниц или "tabs".
индикаторы могут размещаться вверху,
внизу, слева или справа.
void gtk_notebook_set_tab_pos( gtknotebook *notebook,
gtkpositiontype pos );
|
аргумент gtkpositiontype
имеет интуитивно понятные значения:
gtk_pos_left
gtk_pos_right
gtk_pos_top
gtk_pos_bottom
|
по
умолчанию используется gtk_pos_top.
следующим рассмотрим
добавление страниц к набору. есть три
способа сделать это. первые два рассмотрим
вместе, потому что они очень похожи.
void gtk_notebook_append_page( gtknotebook *notebook,
gtkwidget *child,
gtkwidget *tab_label );
void gtk_notebook_prepend_page( gtknotebook *notebook,
gtkwidget *child,
gtkwidget *tab_label );
|
эти функции добавляют
страницы к набору в конец (append), или в
начало (prepend). child - это виджет который
размещен в пределах добавляемой страницы,
а tab_label - это ярлык добавленной
страницы. дочерний виджет должен быть
создан отдельно и может располагаться
в другом виджете контейнере, например
в таблице.
третья функция
добавления страницы имеет те же параметры
что и предыдущие две, а также позволяет
определять расположение добавляемой
страницы.
void gtk_notebook_insert_page( gtknotebook *notebook,
gtkwidget *child,
gtkwidget *tab_label,
gint position );
|
параметр position
определяет позицию добавляемой
страницы относительно первой из набора,
которая имеет позицию ноль (zero).
зная
как можно добавлять страницы, рассмотрим
как их можно удалять:
void gtk_notebook_remove_page( gtknotebook *notebook,
gint page_num );
|
эта функция удаляет
страницу определённую аргументом
page_num из набора notebook.
функция определяющая
текущую страницу в наборе:
gint gtk_notebook_get_current_page( gtknotebook *notebook );
|
следующие две функции
перемещают страницы вперед или назад.
просто укажите функциям набор страниц
с которым хотите работать. учтите: когда
набор страниц находится на последней
странице и вызвана функция
gtk_notebook_next_page(), он переходит на первую.
аналогично, если набор на первой странице
и вызвана функция gtk_notebook_prev_page(), он
переходит на последнюю.
void gtk_notebook_next_page( gtknotebook *notebook );
void gtk_notebook_prev_page( gtknotebook *notebook );
|
следующая функция
определяет активную ("active") страницу.
если вы захотите например открыть какую
нибудь страницу, то вам нужна будет эта
функция. по умолчанию всегда открывается
первая страница.
void gtk_notebook_set_current_page( gtknotebook *notebook,
gint page_num );
|
следующие две функции
добавляют или удаляют из набора вкладки
и границы набора соответственно.
void gtk_notebook_set_show_tabs( gtknotebook *notebook,
gboolean show_tabs );
void gtk_notebook_set_show_border( gtknotebook *notebook,
gboolean show_border );
|
следующая функция
позволяет пролистывать вкладки с помощью
специальных стрелок, когда имеется
слишком большое кол-во страниц и вкладки
не могут сжаться до соответствующего
уровня.
void gtk_notebook_set_scrollable( gtknotebook *notebook,
gboolean scrollable );
|
show_tabs, show_border
и scrollable могут иметь значение true
или false.
рассмотрим
усовершенствованный пример из estgtk.c,
который поставляется вместе с кодом
gtk. эта небольшая программма состоит из
набора страниц и шести кнопок. набор
содержит 11 страниц вставленных разными
способами, наложением, вставкой, и по
выбору. кнопки позволяют добавлять/удалять
вкладки и границы, удалять страницы,
изменять положение страниц в разные
стороны и выходить из программмы.

#include <stdio.h>
#include <gtk/gtk.h>
/* функция перемещает позиции вкладок */
void rotate_book( gtkbutton *button,
gtknotebook *notebook )
{
gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
}
/* добавить/удалить вкладку и границу */
void tabsborder_book( gtkbutton *button,
gtknotebook *notebook )
{
gint tval = false;
gint bval = false;
if (notebook->show_tabs == 0)
if (notebook->show_border == 0)
bval = true;
gtk_notebook_set_show_tabs (notebook, tval);
gtk_notebook_set_show_border (notebook, bval);
}
/* удалить страницу из набора */
void remove_book( gtkbutton *button,
gtknotebook *notebook )
{
gint page;
page = gtk_notebook_get_current_page (notebook);
gtk_notebook_remove_page (notebook, page);
this forces the widget to redraw itself. */
gtk_widget_queue_draw (gtk_widget (notebook));
}
gint delete( gtkwidget *widget,
gtkwidget *event,
gpointer data )
{
gtk_main_quit ();
return false;
}
int main( int argc,
char *argv[] )
{
gtkwidget *window;
gtkwidget *button;
gtkwidget *table;
gtkwidget *notebook;
gtkwidget *frame;
gtkwidget *label;
gtkwidget *checkbutton;
int i;
char bufferf[32];
char bufferl[32];
gtk_init (&argc, &argv);
window = gtk_window_new (gtk_window_toplevel);
g_signal_connect (g_object (window), "delete_event",
g_callback (delete), null);
gtk_container_set_border_width (gtk_container (window), 10);
table = gtk_table_new (3, 6, false);
gtk_container_add (gtk_container (window), table);
/* создаём новый набор, указываем позицию вкладок */
notebook = gtk_notebook_new ();
gtk_notebook_set_tab_pos (gtk_notebook (notebook), gtk_pos_top);
gtk_table_attach_defaults (gtk_table (table), notebook, 0, 6, 0, 1);
gtk_widget_show (notebook);
/* прикладываем страницы к набору */
for (i = 0; i < 5; i++) {
sprintf(bufferf, "append frame %d", i + 1);
sprintf(bufferl, "page %d", i + 1);
frame = gtk_frame_new (bufferf);
gtk_container_set_border_width (gtk_container (frame), 10);
gtk_widget_set_size_request (frame, 100, 75);
gtk_widget_show (frame);
label = gtk_label_new (bufferf);
gtk_container_add (gtk_container (frame), label);
gtk_widget_show (label);
label = gtk_label_new (bufferl);
gtk_notebook_append_page (gtk_notebook (notebook), frame, label);
}
/* добавляем страницу специальной меткой */
checkbutton = gtk_check_button_new_with_label ("check me please!");
gtk_widget_set_size_request (checkbutton, 100, 75);
gtk_widget_show (checkbutton);
label = gtk_label_new ("add page");
gtk_notebook_insert_page (gtk_notebook (notebook), checkbutton, label, 2);
/* вставляем страницы в набор */
for (i = 0; i < 5; i++) {
sprintf (bufferf, "prepend frame %d", i + 1);
sprintf (bufferl, "ppage %d", i + 1);
frame = gtk_frame_new (bufferf);
gtk_container_set_border_width (gtk_container (frame), 10);
gtk_widget_set_size_request (frame, 100, 75);
gtk_widget_show (frame);
label = gtk_label_new (bufferf);
gtk_container_add (gtk_container (frame), label);
gtk_widget_show (label);
label = gtk_label_new (bufferl);
gtk_notebook_prepend_page (gtk_notebook (notebook), frame, label);
}
/* с какой страницы открывать набор (page 4) */
gtk_notebook_set_current_page (gtk_notebook (notebook), 3);
/* создаём кнопки */
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (delete), null);
gtk_table_attach_defaults (gtk_table (table), button, 0, 1, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("next page");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (gtk_notebook_next_page),
g_object (notebook));
gtk_table_attach_defaults (gtk_table (table), button, 1, 2, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("prev page");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (gtk_notebook_prev_page),
g_object (notebook));
gtk_table_attach_defaults (gtk_table (table), button, 2, 3, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("tab position");
g_signal_connect (g_object (button), "clicked",
g_callback (rotate_book),
(gpointer) notebook);
gtk_table_attach_defaults (gtk_table (table), button, 3, 4, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("tabs/border on/off");
g_signal_connect (g_object (button), "clicked",
g_callback (tabsborder_book),
(gpointer) notebook);
gtk_table_attach_defaults (gtk_table (table), button, 4, 5, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("remove page");
g_signal_connect (g_object (button), "clicked",
g_callback (remove_book),
(gpointer) notebook);
gtk_table_attach_defaults (gtk_table (table), button, 5, 6, 1, 2);
gtk_widget_show (button);
gtk_widget_show (table);
gtk_widget_show (window);
gtk_main ();
return 0;
}
|
|