разделяемые окна
разделяемые
окна используются когда нужно создать
две части, относительного размера одного
окна, контролируемые пользователем.
между частями существует специальный
маркер для изменения размера частей
при его захвате и перетаскивании.
разделение может быть как горизонтальным
(hpaned), так и вертикальным (vpaned).
создание нового
разделённого окна:
gtkwidget *gtk_hpaned_new (void);
gtkwidget *gtk_vpaned_new (void);
|
после создания
двух разделённых частей может потребоваться
размещение в них дочерних виджетов. это
делается так:
void gtk_paned_add1 (gtkpaned *paned, gtkwidget *child);
void gtk_paned_add2 (gtkpaned *paned, gtkwidget *child);
|
gtk_paned_add1()
добавляет дочерний виджет в левую или
верхнюю часть разделённого окна.
gtk_paned_add2() добавляет дочерний виджет
в правую или нижнюю часть разделённого
окна.
как пример, мы создадим часть
пользовательского интерфейса воображаемой
почтовой программмы. окно разделено
на две части вертикально, с главной
частью, являющейся списком почтовых
сообщений и части основания - текст
почтового сообщения.
большая часть программмы
достаточно проста. в ней есть несколько
строк для информации в которые не может
быть добавлен текст. это могло быть
выполнено вызовом функции
gtk_widget_realize(), но как демонстрация
дополнительной методики, мы подключаем
обработчик с сигналом "realize" -
добавить текст. кроме того, мы должны
добавить опцию gtk_shrink к некоторым из
элементов в таблице, содержащей текстовое
окно и его полосы прокрутки, чтобы, когда
часть основания уменьшается, сжались
правильные части виджета, вместо того,
чтобы размешаться в основании окна.
#include <stdio.h>
#include <gtk/gtk.h>
/* создаём список "messages" */
gtkwidget *create_list( void )
{
gtkwidget *scrolled_window;
gtkwidget *tree_view;
gtkliststore *model;
gtktreeiter iter;
gtkcellrenderer *cell;
gtktreeviewcolumn *column;
int i;
/* создаём новое окно, с полосой прокрутки при необходимости */
scrolled_window = gtk_scrolled_window_new (null, null);
gtk_scrolled_window_set_policy (gtk_scrolled_window (scrolled_window),
gtk_policy_automatic,
gtk_policy_automatic);
model = gtk_list_store_new (1, g_type_string);
tree_view = gtk_tree_view_new ();
gtk_scrolled_window_add_with_viewport (gtk_scrolled_window (scrolled_window),
tree_view);
gtk_tree_view_set_model (gtk_tree_view (tree_view), gtk_tree_model (model));
gtk_widget_show (tree_view);
/* добавляем некоторое сообщение в окно */
for (i = 0; i < 10; i++) {
gchar *msg = g_strdup_printf ("message #%d", i);
gtk_list_store_append (gtk_list_store (model), &iter);
gtk_list_store_set (gtk_list_store (model),
&iter,
0, msg,
-1);
g_free (msg);
}
cell = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("messages",
cell,
"text", 0,
null);
gtk_tree_view_append_column (gtk_tree_view (tree_view),
gtk_tree_view_column (column));
return scrolled_window;
}
/* добавляем некоторый текст в виджет текста */
void insert_text (gtktextbuffer *buffer)
{
gtktextiter iter;
gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
gtk_text_buffer_insert (buffer, &iter,
"from: pathfinder@nasa.gov\n"
"to: mom@nasa.gov\n"
"subject: made it!\n"
"\n"
"we just got in this morning. the weather has been\n"
"great - clear but cold, and there are lots of fun sights.\n"
"sojourner says hi. see you soon.\n"
" -path\n", -1);
}
/* создаём прокручиваемую текстовую область, которая содержит список сообщений "message" */
gtkwidget *create_text( void )
{
gtkwidget *scrolled_window;
gtkwidget *view;
gtktextbuffer *buffer;
view = gtk_text_view_new ();
buffer = gtk_text_view_get_buffer (gtk_text_view (view));
scrolled_window = gtk_scrolled_window_new (null, null);
gtk_scrolled_window_set_policy (gtk_scrolled_window (scrolled_window),
gtk_policy_automatic,
gtk_policy_automatic);
gtk_container_add (gtk_container (scrolled_window), view);
insert_text (buffer);
gtk_widget_show_all (scrolled_window);
return scrolled_window;
}
int main( int argc,
char *argv[] )
{
gtkwidget *window;
gtkwidget *vpaned;
gtkwidget *list;
gtkwidget *text;
gtk_init (&argc, &argv);
window = gtk_window_new (gtk_window_toplevel);
gtk_window_set_title (gtk_window (window), "paned windows");
g_signal_connect (g_object (window), "destroy",
g_callback (gtk_main_quit), null);
gtk_container_set_border_width (gtk_container (window), 10);
gtk_widget_set_size_request (gtk_widget (window), 450, 400);
/* создаём виджет vpaned и добавляем его в основное окно */
vpaned = gtk_vpaned_new ();
gtk_container_add (gtk_container (window), vpaned);
gtk_widget_show (vpaned);
/* теперь создаём содержимое двух половин окна */
list = create_list ();
gtk_paned_add1 (gtk_paned (vpaned), list);
gtk_widget_show (list);
text = create_text ();
gtk_paned_add2 (gtk_paned (vpaned), text);
gtk_widget_show (text);
gtk_widget_show (window);
gtk_main ();
return 0;
}
|
|