линейки
виджеты
линейки используются для индикации
координат места положения курсора мыши
в данном окне. существуют горизонтальные
линейки и вертикальные, располагающиеся
в окне соответственно. точное положение
курсора отображается на линейки с
помощью специального треугольника,
выполняющего роль стрелки.
горизонтальные и
вертикальные линейки создаются при
помощи функций:
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;
}
|
|