GTK+ 2.0 Tutorial |
||
---|---|---|
Разные виджеты (Miscellaneous Widgets) |
Строка состояния, это простой виджет для отображения текстовых сообщений. Она содержит сообщения в стеке, таким образом каждое сообщение может быть выведено повторно после перекрытия новым сообщением.
Чтобы позволить различным частям приложения использовать туже самую строку состояния (statusbar), для отображения сообщений, statusbar виджет использует Идентификаторы Контекста, которые используются, чтобы идентифицировать различных "пользователей". На экран выводится сообщение находящееся в данный момент сверху в стеке, не зависимо от контекста. Сообщения помещаются в стек по принципу - "последний вошёл первый вышел", независимо от контекста.
Строка состояния создаётся вызовом:
GtkWidget *gtk_statusbar_new( void );
|
Новый контекстный идентификатор (Context Identifier) создаётся используя функцию с коротким текстовым описанием контекста:
guint gtk_statusbar_get_context_id( GtkStatusbar *statusbar,
const gchar *context_description );
|
Существует три функции для работы со statusbars:
guint gtk_statusbar_push( GtkStatusbar *statusbar,
guint context_id,
const gchar *text );
void gtk_statusbar_pop( GtkStatusbar *statusbar)
guint context_id );
void gtk_statusbar_remove( GtkStatusbar *statusbar,
guint context_id,
guint message_id );
|
Первая, gtk_statusbar_push(), используется для добавления сообщений в строку состояния. Она возвращает идентификатор сообщения (Message Identifier), который может быть использован функцией gtk_statusbar_remove для удаления данного сообщения из стека строки состояния.
Функция gtk_statusbar_pop() перемещает на вершину стека сообщение с определенным идентификатором (Context Identifier).
В дополнение к текстовым сообщениям может отображаться небольшая область для изменения размера основного окна при захвате курсором мыши. Следующие функции предназначены для отображения области контроля размера окна в строке состояния.
void gtk_statusbar_set_has_resize_grip( GtkStatusbar *statusbar,
gboolean setting );
gboolean gtk_statusbar_get_has_resize_grip( GtkStatusbar *statusbar );
|
В следующем примере в окне расположена строка состояния и две кнопки, первая размещает дополнительный пункт в стеке, а вторая выводит предыдущий пункт.
#include <stdlib.h>
#include <gtk/gtk.h>
#include <glib.h>
GtkWidget *status_bar;
void push_item( GtkWidget *widget,
gpointer data )
{
static int count = 1;
char buff[20];
g_snprintf (buff, 20, "Item %d", count++);
gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT (data), buff);
return;
}
void pop_item( GtkWidget *widget,
gpointer data )
{
gtk_statusbar_pop (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT (data));
return;
}
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *button;
gint context_id;
gtk_init (&argc, &argv);
/* создаём новое окно */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
gtk_window_set_title (GTK_WINDOW (window), "GTK statusbar");
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (exit), NULL);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
status_bar = gtk_statusbar_new ();
gtk_box_pack_start (GTK_BOX (vbox), status_bar, TRUE, TRUE, 0);
gtk_widget_show (status_bar);
context_id = gtk_statusbar_get_context_id(
GTK_STATUSBAR (status_bar), "Statusbar example");
button = gtk_button_new_with_label ("push item");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (push_item), GINT_TO_POINTER (context_id));
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("pop last item");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (pop_item), GINT_TO_POINTER (context_id));
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);
gtk_widget_show (button);
/* выводим на экран всё содержимое окна */
gtk_widget_show (window);
gtk_main ();
return 0;
}
|
Rulers |
Text Entries |