你可能要问,如果我想创建一个信号处理函式,当用户调整范围元件或微调按钮时让这个处理函式进行响应,应该从调整物件中取什么值,怎样从中取值呢?要解决这个问题,先看一下 _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"); |
现在尽情使用调整物件吧!
1 則留言
Comments are closed.