прокручиваемое
окно
прокручиваемое
окно (scrolled windows) используется для создания
большой области содержащей другие
виджеты с возможность постепенного
просмотра содержимого. вы можете
вставлять в прокручиваемое окно любой
тип виджетов и содержимое будет доступно
несмотря на размер, благодаря scrollbars.
функция для создания
прокручиваемого окна:
gtkwidget *gtk_scrolled_window_new( gtkadjustment *hadjustment,
gtkadjustment *vadjustment );
|
первый аргумент
отвечает за горизонтальное регулирование,
второй за вертикальное. все значения
могут быть равны null.
void gtk_scrolled_window_set_policy( gtkscrolledwindow *scrolled_window,
gtkpolicytype hscrollbar_policy,
gtkpolicytype vscrollbar_policy );
|
эта функция
устанавливает политику использования
полосы прокручивания. первый аргумент
- окно прокручивания которое вы хотите
настроить. второй - политика горизонтального
прокручивания и третий - политика
вертикального прокручивания.
политика может
быть двух типов, gtk_policy_automatic или
gtk_policy_always. gtk_policy_automatic
автоматически определяет необходимость
появления полосы прокручивания, а
gtk_policy_always всегда показывает полосу
прокручивания.
вы можете размещать
объекты в окне прокручивания с помощью
функции:
void gtk_scrolled_window_add_with_viewport( gtkscrolledwindow *scrolled_window,
gtkwidget *child);
|
в
этом примере в окно прокручивания
помещено 100 кнопок переключателей. в
исходном коде прокомментированны только
плохо знакомые вам части.

#include <stdio.h>
#include <gtk/gtk.h>
void destroy( gtkwidget *widget,
gpointer data )
{
gtk_main_quit ();
}
int main( int argc,
char *argv[] )
{
static gtkwidget *window;
gtkwidget *scrolled_window;
gtkwidget *table;
gtkwidget *button;
char buffer[32];
int i, j;
gtk_init (&argc, &argv);
/* создаём новый диалог окна прокручивания для упаковки */
window = gtk_dialog_new ();
g_signal_connect (g_object (window), "destroy",
g_callback (destroy), null);
gtk_window_set_title (gtk_window (window), "gtkscrolledwindow example");
gtk_container_set_border_width (gtk_container (window), 0);
gtk_widget_set_size_request (window, 300, 300);
/* создаём новое окно прокручивания. */
scrolled_window = gtk_scrolled_window_new (null, null);
gtk_container_set_border_width (gtk_container (scrolled_window), 10);
/* политика появления полос прокручивания gtk_policy automatic, или gtk_policy_always.
* gtk_policy_automatic автоматически определяет необходимость полосы прокручивания
* gtk_policy_always всегда выводит полосу прокручивания даже если прокручивать нечего
* первая - горизонтальная полоса прокручивания,вторая - вертикальная */
gtk_scrolled_window_set_policy (gtk_scrolled_window (scrolled_window),
gtk_policy_automatic, gtk_policy_always);
/* создаём окно диалога с упакованным в него vbox */
gtk_box_pack_start (gtk_box (gtk_dialog(window)->vbox), scrolled_window,
true, true, 0);
gtk_widget_show (scrolled_window);
/* создаём таблицу 10 на 10 */
table = gtk_table_new (10, 10, false);
/* устанавливаем интервал в 10 на x и 10 на y */
gtk_table_set_row_spacings (gtk_table (table), 10);
gtk_table_set_col_spacings (gtk_table (table), 10);
/* упаковываем таблицу в окно прокручивания */
gtk_scrolled_window_add_with_viewport (
gtk_scrolled_window (scrolled_window), table);
gtk_widget_show (table);
/* просто создаём сетку из кнопок для демонстрации окна прокручивания */
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++) {
sprintf (buffer, "button (%d,%d)\n", i, j);
button = gtk_toggle_button_new_with_label (buffer);
gtk_table_attach_defaults (gtk_table (table), button,
i, i+1, j, j+1);
gtk_widget_show (button);
}
/* добавляем в диалог кнопку "close" */
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (gtk_widget_destroy),
g_object (window));
/* устанавливаем кнопку по умолчанию */
gtk_widget_set_flags (button, gtk_can_default);
gtk_box_pack_start (gtk_box (gtk_dialog (window)->action_area), button, true, true, 0);
/* перехватываем сигнал нажатия клавиши "enter" для активизации кнопки по умолчанию */
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return 0;
}
|
попробуйте по изменять размеры окна,
чтобы увидеть реакцию полос прокручивания.
вы можете использовать функцию
gtk_widget_set_size_request() для установки размеров
окна или других виджетов по умолчанию.
|