|
GTK+ 2.0 Tutorial |
||
|---|---|---|
|
Adjustments |
||
Хорошо поняв вышесказанное, возникает вопрос: как можно создать собственный обработчик сигнала для перехвата сигналов регулирования, при использовании регуляторов пользователем, и как устанавливать значение диапазона регулировок в таких обработчиках?
Чтобы ответить на этот вопрос и последующие, для начала рассмотрим структуру struct _GtkAdjustment:
struct _GtkAdjustment
{
GtkObject parent_instance;
gdouble lower;
gdouble upper;
gdouble value;
gdouble step_increment;
gdouble page_increment;
gdouble page_size;
};
|
Если вы не хотите напрямую обрашаться к полям структуры, вы можете использовать аксессор для получения значения value:
gdouble gtk_adjustment_get_value( GtkAdjustment *adjustment); |
Когда вы установите значение value у регулятора, вы, обычно, хотите чтобы оно было отражено во всех виджетах, использующих этот регулятор, GTK позволяет сделать это с помощью функции:
void gtk_adjustment_set_value( GtkAdjustment *adjustment,
gdouble value );
|
Как упоминалось ранее, Adjustment это подкласс Object, как и все виджеты, и, следовательно, он может производить сигналы. И поэтому обновления происходят автоматически, когда вы совместно используете объект регулятора и для 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);
|
А что если пользователь добавит информацию в виджет и тем самым расширит область регулировки? В этом случае производится сигнал "changed":
void (* changed) (GtkAdjustment *adjustment); |
Обычно виджеты регулировки диапазона подключают к этому сигналу обработчик, который изменяет их внешний вид - например размер ползунка в полосе прокрутки уменьшается пропорционально увеличению области прокручивания.
Вам наверное никогда не понадобится к этому сигналу подключать обработчик, за исключением случаев создания новых типов виджетов регуляторов. Однако, если вы непосредственно изменяете значение регулятора, вам потребуется вызвать этот сигнал для перенастройки всех виджетов, использующих его, так:
g_signal_emit_by_name (G_OBJECT (adjustment), "changed"); |
|
Using Adjustments the Easy Way |
Range Widgets |