ein Kapitel zurück                                           ein Kapitel weiter

Als nächsten Schritt müssen wir nun den Wertebereiche und die Größe und Schrittweite des Scrollbars einstellen. Dies geschieht mit der Funktion:

GtkObject *gtk_adjustment_new(gfloat value, gfloat lower, gfloat upper,
                              gfloat step_increment, gfloat page_increment,
                              gfloat page_size);  

Folgende Bedeutung haben dabei die einzelnen Parameter, welchen sie immer einen float-Wert übergeben müssen:

  • value - der zu initialisierende Wert (Position der Scrollbar zum Start)
  • lower - Wert der kleinsten Postion
  • upper - Wert der größten Position
  • step_increment - Schrittweite zwischen lower und upper wenn auf den Pfeil gedrückt wird.
  • page_increment - Schrittweite für die Scrollbar
  • page_size - Größe der Scrollbar

Nun wollen wir unser Adjustment auf das Programmbeispiel vom Kapitel zuvor loslassen:

/*Download:gtkscr2.c*/

#include <gtk/gtk.h>


void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *box;
 GtkWidget *hscrollbar1, *hscrollbar2, *hscrollbar3;
 GtkWidget *button_quit;
 GtkObject *adj1, *adj2, *adj3;

 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/

 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box = gtk_vbox_new(FALSE,0);

 adj1 = gtk_adjustment_new(50.0, 0.0, 100.0, 1.0, 1.0, 1.0);
 adj2 = gtk_adjustment_new(0.0, 0.0, 100.0, 10.0, 1.0, 1.0);
 adj3 = gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 1.0, 50.0);

 hscrollbar1 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj1));
 hscrollbar2 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj2));
 hscrollbar3 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj3));

 /*Signale registrieren*/
 gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked",
                           GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(ende_cb), NULL);


 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),25);

 /*Nun alles rein in die Box....*/
 gtk_box_pack_start(GTK_BOX(box), hscrollbar1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), hscrollbar2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), hscrollbar3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 20);


 gtk_container_add(GTK_CONTAINER(fenster),box);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Nun ergibt sich schon ein anderes Bild:




Nachträglich die aktuelle Position der Scrollbar, die Variable value, können sie ändern mit der Funktion:

void gtk_adjustment_set_value(GtkAdjustment *adj, gfloat value);  

Bei unserem Programm könnten wir dies bei der Scrollbar Nummer 3 so machen:

gtk_adjustment_set_value(GTK_ADJUSTMENT(adj3), 40.0);  

Der nächste Schritt dürfte wohl sein einen Signal-handler einzurichten und zu Überprüfen ob sich die Position der Scrollbar verändert hat. Dabei muss nur auf das Event "value_changed" gecheckt werden. Hier unser Beispiel dazu. Die Ausgabe einer Veränderung geschieht wieder über die Konsole:

/*Download:gtkscr3.c*/

#include <gtk/gtk.h>


void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}


void scrollbar_cb(GtkAdjustment *adj, gpointer user_data)
{
 g_print("%s hat sich verändert ",(char *)user_data);
 g_print("neue Pos. : %f\n", adj->value);
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *box;
 GtkWidget *hscrollbar1, *hscrollbar2, *hscrollbar3;
 GtkWidget *button_quit;
 GtkObject *adj1, *adj2, *adj3;

 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/

 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box = gtk_vbox_new(FALSE,0);

 adj1 = gtk_adjustment_new(50.0, 0.0, 100.0, 0.1, 1.0, 1.0);
 adj2 = gtk_adjustment_new(0.0, 0.0, 100.0, 10.0, 1.0, 1.0);
 adj3 = gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 1.0, 50.0);

 hscrollbar1 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj1));
 hscrollbar2 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj2));
 hscrollbar3 = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj3));



 /*Signale registrieren*/
 gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked",
                           GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(ende_cb), NULL);
 gtk_signal_connect(GTK_OBJECT(adj1), "value_changed",
                    GTK_SIGNAL_FUNC(scrollbar_cb), "Scrollbar 1");
 gtk_signal_connect(GTK_OBJECT(adj2), "value_changed",
                    GTK_SIGNAL_FUNC(scrollbar_cb), "Scrollbar 2");
 gtk_signal_connect(GTK_OBJECT(adj3), "value_changed",
                    GTK_SIGNAL_FUNC(scrollbar_cb), "Scrollbar 3");


 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),25);

 /*Nun alles rein in die Box....*/
 gtk_box_pack_start(GTK_BOX(box), hscrollbar1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), hscrollbar2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), hscrollbar3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 20);


 gtk_container_add(GTK_CONTAINER(fenster),box);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Wollen sie hingegen überprüfen ob sich Irgendein Wert des Adjustment geändert hat, müssen sie einen Signalhandler mit dem Event "changed" einrichten. Sie können diese beiden Signale für das Adjustment auch mit folgenden Funktionen auslösen:

void gtk_adjustment_changed(void);
void gtk_adjustment_value_changed(void);  

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf