GTK+ 2.0 Tutorial

<<< Previous

Разные виджеты (Miscellaneous Widgets)

Next >>>


Линейки

Виджеты линейки используются для индикации координат места положения курсора мыши в данном окне. Существуют горизонтальные линейки и вертикальные, располагающиеся в окне соответственно. Точное положение курсора отображается на линейки с помощью специального треугольника, выполняющего роль стрелки.

Горизонтальные и вертикальные линейки создаются при помощи функций:

GtkWidget *gtk_hruler_new( void ); /* горизонтальная линейка */ GtkWidget *gtk_vruler_new( void ); /* вертикальная линейка */

После создания линейки, можно определить значение единиц измерения. Единицы измерения линеек могут быть GTK_PIXELS, GTK_INCHES или GTK_CENTIMETERS:

void gtk_ruler_set_metric( GtkRuler *ruler, GtkMetricType metric );

По умолчанию единицы измерения установлены в GTK_PIXELS.

gtk_ruler_set_metric( GTK_RULER(ruler), GTK_PIXELS );

Другими важными параметрами линеек является изначальное расположение индикатора положения и как нанесена разметка линейки. Это устанавливается с помощью:

void gtk_ruler_set_range( GtkRuler *ruler, gdouble lower, gdouble upper, gdouble position, gdouble max_size );

Аргументы lower и upper определяют размер линейки, а max_size наибольшее число для отображения. Аргумент position определяет начальное расположение индикатора линейки.

Вертикальная линейка в 800 pixel, может быть определена таким образом:

gtk_ruler_set_range( GTK_RULER(vruler), 0, 800, 0, 800);

Линейка будет промаркирована от 0 до 800, с отображением цифр каждые 100 pixels. Чтобы установить размер линейки от 7 до 16 нужно ввести следующее:

gtk_ruler_set_range( GTK_RULER(vruler), 7, 16, 0, 20);



Если линейка используется для следования за указателем мыши, то необходимо к линейке подключить сигнал motion_notify_event соответствующим методом. Для следования за всеми движениями курсора мыши в окне нужно использовать:

#define EVENT_METHOD(i, x) GTK_WIDGET_GET_CLASS(i)->x g_signal_connect_swapped (G_OBJECT (area), "motion_notify_event", G_CALLBACK (EVENT_METHOD (ruler, motion_notify_event)), G_OBJECT (ruler));



В следующем примере создаётся окно с горизонтальной линейкой вверху и вертикальной слева. Размер полотна определен в 600 пикселей ширины и 400 высоты. Горизонтальная линейка охватывает от 7 до 13 единиц, с маркировкой через каждые 10 pixels, а вертикальная линейка охватывает от 0 до 400 единиц, с маркировкой через каждые 100 pixels. Размещение полотна и линеек в окне выполнено с использованием таблицы.

#include <gtk/gtk.h> #define EVENT_METHOD(i, x) GTK_WIDGET_GET_CLASS(i)->x #define XSIZE 600 #define YSIZE 400 /* Стандартная операция выхода из программы при нажатии на кнопку выход */ gint close_application( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit (); return FALSE; } /* Стандартная функция main */ int main( int argc, char *argv[] ) { GtkWidget *window, *table, *area, *hrule, *vrule; /* Инициализируем GTK и создаём новое основное окно */ gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (close_application), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Создаём таблицу для размещения полотна и линеек */ table = gtk_table_new (3, 2, FALSE); gtk_container_add (GTK_CONTAINER (window), table); area = gtk_drawing_area_new (); gtk_widget_set_size_request (GTK_WIDGET (area), XSIZE, YSIZE); gtk_table_attach (GTK_TABLE (table), area, 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_events (area, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); /* Горизонтальная линейка располагается сверху. При передвижении указателя мыши * по полотну, сигнал motion_notify_event посылается обработчику сигналов для линейки. */ hrule = gtk_hruler_new (); gtk_ruler_set_metric (GTK_RULER (hrule), GTK_PIXELS); gtk_ruler_set_range (GTK_RULER (hrule), 7, 13, 0, 20); g_signal_connect_swapped (G_OBJECT (area), "motion_notify_event", G_CALLBACK (EVENT_METHOD (hrule, motion_notify_event)), G_OBJECT (hrule)); gtk_table_attach (GTK_TABLE (table), hrule, 1, 2, 0, 1, GTK_EXPAND|GTK_SHRINK|GTK_FILL, GTK_FILL, 0, 0); /* Вертикальная линейка располагается слева. При передвижении указателя мыши * по полотну, сигнал motion_notify_event посылается обработчику сигналов для линейки. */ vrule = gtk_vruler_new (); gtk_ruler_set_metric (GTK_RULER (vrule), GTK_PIXELS); gtk_ruler_set_range (GTK_RULER (vrule), 0, YSIZE, 10, YSIZE ); g_signal_connect_swapped (G_OBJECT (area), "motion_notify_event", G_CALLBACK (EVENT_METHOD (vrule, motion_notify_event)), G_OBJECT (vrule)); gtk_table_attach (GTK_TABLE (table), vrule, 0, 1, 1, 2, GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0); /* Выводим всё на экран */ gtk_widget_show (area); gtk_widget_show (hrule); gtk_widget_show (vrule); gtk_widget_show (table); gtk_widget_show (window); gtk_main (); return 0; }

<<< Previous

Home

Next >>>

Dialogs

Up

Statusbars