GTK+ 2.0 Tutorial

<<< Previous

Adjustments

Next >>>


Внутреннее устройство регуляторов

Хорошо поняв вышесказанное, возникает вопрос: как можно создать собственный обработчик сигнала для перехвата сигналов регулирования, при использовании регуляторов пользователем, и как устанавливать значение диапазона регулировок в таких обработчиках?

Чтобы ответить на этот вопрос и последующие, для начала рассмотрим структуру struct _GtkAdjustment:

struct _GtkAdjustment { GtkObject parent_instance; gdouble lower; gdouble upper; gdouble value; gdouble step_increment; gdouble page_increment; gdouble page_size; };

(real C programmer), вы можете использовать другой способ доступа к изменению значений регулирования:

gdouble gtk_adjustment_get_value( GtkAdjustment *adjustment);

Когда вы установите значения регулировок, вы захотите чтобы все виджеты использовали эти значения как основные, GTK позволяет  сделать это с помощью функции, например:

void gtk_adjustment_set_value( GtkAdjustment *adjustment, gdouble value );

Как упоминалось ранее, Регуляторы это подкласс объектов как и все виджеты, поэтому они могут производить сигналы. Обновления случаются автоматически, когда вы совместно используете объект настройки между scrollbar и другим регулировочным виджетом; все регулировочные виджеты подключают обработчики сигнала с сигналом value_changed для их настройки. Вот - определение этого сигнала в struct _GtkAdjustmentClass:

void (* value_changed) (GtkAdjustment *adjustment);

Различные виджеты использующие объекты регулирования, создают этот сигнал каждый раз, когда происходит изменение значения регулятора. Это происходит и тогда, когда пользователь изменяет положение регулятора, и когда программа явно изменяет значение используя gtk_adjustment_set_value(). Так например при использовании регулятора масштаба изображения, нужно чтобы вид изображения менялся всякий раз когда меняется значение регулятора, для этого создаётся обратный вызов:

void cb_rotate_picture (GtkAdjustment *adj, GtkWidget *picture) { set_picture_rotation (picture, gtk_adjustment_get_value (adj)); ...

и подключается регулятор масштаба:

g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (cb_rotate_picture), (gpointer) picture);

А что если пользователь добавит информацию в виджет, тем самым расширит область регулировки? В этом случае производится изменённый сигнал:

void (* changed) (GtkAdjustment *adjustment);

Обычно виджеты регулировки диапазона подключают к этому сигналу обработчик, который изменяет их внешний вид - например размер ползунка в полосе прокрутки уменьшается пропорционально увеличению области прокручивания.

Вам наверное никогда не понадобится к этому сигналу подключать обработчик, за исключением случаев создания новых типов виджетов диапазона. Однако, если вы непосредственно изменяете значения регулировок, вам потребуется создавать этот сигнал для перенастройки любого виджета примерно так:

g_signal_emit_by_name (G_OBJECT (adjustment), "changed");

<<< Previous

Home

Next >>>

Using Adjustments the Easy Way

Up

Range Widgets