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