Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, Systemprogrammierung C C++ C/C++ ANSI C Linux Windows GUI gtk gtk+ Gimp Toolkit Widgets Scrollbar GUI gtk gtk+ Gimp Toolkit Widgets Scrollbar Scrollbar Widget

Horizontale Scrollbar           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

Um eine horizontale Scrollbar zu erzeugen gibt es die Funktion ...

GtkWidget *gtk_hscrollbar_new(GtkAdjustment *adj);

Bevor wir zum Parameter Adjustment kommen, wollen wir uns doch erst mal ein Beispielsprogramm zu einer Scrollbar ansehen ...

#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;

 /*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);

 hscrollbar1 = gtk_hscrollbar_new(NULL);
 hscrollbar2 = gtk_hscrollbar_new(NULL);
 hscrollbar3 = gtk_hscrollbar_new(NULL);

 /*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;
}

Und so könnte es aussehen ...

An diesem Beispiel kann man schon erkennen, dass es noch einiges mehr an Einstellungen bedarf, um Scrollbars anzuwenden. Es muss natürlich angemerkt werden, dass alles was Sie in diesem Kapitel lernen, auch für die anderen Kapiteln mit Scrollbars gültig ist.

Adjustment           zurück Ein Kapitel tiefer Ein Kapitel höher zum Inhaltsverzeichnis

Als nächsten Schritt müssen wir nun den Wertebereiche, die Größe und die 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 ...

Nun wollen wir das Adjustment auf das Programmbeispiel vom Kapitel zuvor anwenden ...

#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 dem Programm könnten Sie dies mit 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" überprüft werden. Hierzu das Beispiel dazu. Die Ausgabe einer Veränderung geschieht wieder über die Konsole ...

#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);

Vertikale Scrollbox           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

Da für die vertikale Scrollbox dasselbe gilt, wie für die Horizontale, wollen wir dieses Thema recht kurz halten. Zuerst die Funktion mit der wir eine Vertikale Box erstellen können ...

GtkWidget *gtk_hscrollbar_new(GtkAdjustment *adj);

Und noch das Programmbeispiel dazu ...

#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, *box2;
 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_hbox_new(FALSE,10);
 box2= gtk_vbox_new(TRUE,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_vscrollbar_new(GTK_ADJUSTMENT(adj1));
 hscrollbar2 = gtk_vscrollbar_new(GTK_ADJUSTMENT(adj2));
 hscrollbar3 = gtk_vscrollbar_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(box2), box, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box2), button_quit, FALSE, FALSE, 20);

 gtk_container_add(GTK_CONTAINER(fenster),box2);

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

 gtk_main();

 return 0;
}

Und so könnte es aussehen ...

Weiter mit Horizontale Scale Widget