范围构件本质上来说都是相当复杂的,不过,像所有“基本类”构件一样,绝大部分复杂性只有当你想彻底了解它时才吸引人。同样,几乎所有它定义的函数和信号都只在用它们写派生构件时才真正用到。然而,在<gtk/gtkrange.h>中还是有一些很有用的函数,它们对所有范围构件都起作用。

设置更新方式

范围构件的“更新方式”定义了用户与构件交互时的它的调整对象的value值如何变化,以及如何引发 “value_changed” 信号给调整对象。更新方式在<gtk/gtkenums.h>中定义为enum GtkUpdateType类型,有以下取值:

GTK_UPDATE_CONTINUOUS

这是默认值。”value_changed” 信号是连续引发,例如,每当滑块移动,甚至移动最小数量时都会引发。

GTK_UPDATE_DISCONTINUOUS

只有滑块停止移动,用户释放鼠标键时才引发 “value_changed” 信号。

GTK_UPDATE_DELAYED

当用户释放鼠标键,或者滑块短期停止移动时才引发 “value_changed” 信号。

范围构件的更新方式可以用以下方法设置:用GTK_RANGE(widget)宏将构件转换,并将它传递给这个函数:

void gtk_range_set_update_policy( GtkRange      *range,
                              GtkUpdateType  policy); 

获得和设置调整对象

猜得出,用以下函数”快速”取得和设置调整对象:

GtkAdjustment* gtk_range_get_adjustment( GtkRange *range );

void gtk_range_set_adjustment( GtkRange      *range,
                               GtkAdjustment *adjustment ); 

gtk_range_get_adjustment()返回一个指向range所连接的调整对象的指针。

如果将range正在使用的调整对象传递给gtk_range_set_adjustment()函数,什么也不会发生,不管是否改变了其内部的值。如果是将一个新的调整对象传递给它,它会将旧的调整对象(如果存在)解除引用(unreference)(可能会销毁它),将适当的信号连接到新的调整对象,并且调用私有函数gtk_range_adjustment_changed(),该函数将(或至少假装会…)重新计算滑块的尺寸和/或位置,并在需要时重新绘出该构件。正如在调整对象部分所提到的,如果想重新使用同一个调整对象,当直接修改它的值时,应该引发一个 “changed” 信号给它,像这样:

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