你可能要问,如果我想创建一个信号处理函数,当用户调整范围构件或微调按钮时让这个处理函数进行响应,应该从调整对象中取什么值,怎样从中取值呢?要解决这个问题,先看一下 _GtkAdjustment结构的定义:
struct _GtkAdjustment { GtkObject parent_instance; gdouble lower; gdouble upper; gdouble value; gdouble step_increment; gdouble page_increment; gdouble page_size; }; |
如果你不喜欢像一个 real C程序员那样直接从结构中取值,你可以使用下面的函数来获取调整对象的value参数值:
gdouble gtk_adjustment_get_value( GtkAdjustment *adjustment); |
因为设置调整对象的值时,通常想让每个使用这个调整对象的构件对值的改变做出响应,GTK 提供了下面的函数:
void gtk_adjustment_set_value( GtkAdjustment *adjustment, gdouble value ); |
前面说过,和其它构件一样,调整对象是Object的子类,因而,它也能够引发信号。这也是为什么当滚动条和其它可调整构件共享调整对象时它们能够自动更新的原因。所有的可调整构件都为它们的调整对象的value_changed信号设置了一个信号处理函数。下面是这个信号在_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), picture); |
当构件重新配置了它的调整对象的upper或lower参数时(比如,用户向文本构件添加了更多的文本时),发生了什么?在这种情况下,它会引发一个changed信号:
void (* changed) (GtkAdjustment *adjustment); |
范围构件一般为这个信号设置回调函数,构件会改变它们的外观以反映变化。例如,滚动条上的滑块会根据它的调整对象的lower和upper参数之间的差值的变化而伸长或缩短。
一般不需要处理这个信号,除非你想要写一个新的范围构件。不过,如果直接改变了调整对象的任何参数,应该引发这个信号,以便相关构件重新配置自己。用下面的函数引发这个信号:
g_signal_emit_by_name (G_OBJECT (adjustment), "changed"); |
现在尽情使用调整对象吧!