The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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






Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру