_GtkAdjustment对象的结构体

你可能要问,如果我想创建一个信号处理的回调函数,当用户调整范围控件或微调按钮时让这个处理函数进行响应,应该从调整对象中取什么值,怎样从中取值呢?要解决这个问题,先看一下 _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");

现在尽情使用调整对象吧!