ein Kapitel zurück                                           ein Kapitel weiter

Checkbuttons und Radiobuttons funktionieren genauso wie Toogled Buttons und verwenden auch die selben Funktionen. Nur eben bei der Erzeugen werden andere Funktionen aufgerufen. Hier die Funktionen wie sie Check Buttons erzeugen können:

GtkWidget *gtk_check_button_new(void);

...oder mit Label...

GtkWidget *gtk_check_button_new_with_label(gchar *label);  

Hierzu das selben Programmbeispiel wie im Kapitel zuvor, den Toggled Buttons, nur eben mit Checkbuttons:

/*Download:gtkchk.c*/

#include <gtk/gtk.h>

GtkWidget *button1, *button2, *button3, *button_quit;

void ende_cb(GtkObject *object)
{
  g_print("\n\nZustand der Toggled Buttons zum Abschluss : \n");
 if(GTK_TOGGLE_BUTTON(button1)->active)
   g_print("Knopf 1 war aktiviert (toggled)\n");
 else
   g_print("Knopf 1 war deaktiviert (not toggled)\n");

 if(GTK_TOGGLE_BUTTON(button2)->active)
   g_print("Knopf 2 war aktiviert (toggled)\n");
 else
   g_print("Knopf 2 war deaktiviert (not toggled)\n");

 if(GTK_TOGGLE_BUTTON(button3)->active)
   g_print("Knopf 3 war aktiviert (toggled)\n");
 else
   g_print("Knopf 3 war deaktiviert (not toggled)\n");


 gtk_main_quit();
}

void check_toggle_cb(GtkWidget *widget, gpointer data)
{
 if(GTK_TOGGLE_BUTTON(widget)->active)
   g_print("%s aktiviert (toggled)\n",(char *)data);
 else
   g_print("%s deaktiviert (not toggled)\n",(char *)data);
}

int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *box;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_check_button_new_with_label("Knopf 1");
 button2  = gtk_check_button_new_with_label("Knopf 2");
 button3  = gtk_check_button_new_with_label("Knopf 3");
 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box = gtk_vbox_new(FALSE,0);

 /*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(button1), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 1");
 gtk_signal_connect(GTK_OBJECT(button2), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 2");
 gtk_signal_connect(GTK_OBJECT(button3), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 3");
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Toggled Buttons");
 /*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), button1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 20);

 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button1),TRUE);

 gtk_container_add(GTK_CONTAINER(fenster),box);

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

 gtk_main();

 return 0;
}

Und so könnte es aussehen:




Sie sehen das wir nur die Funktionen zum Erzeugen der Buttons geändert haben.

Radiobuttons
Ähnlich läuft dies auch mit Radio-Buttons ab. Hier die beiden Funktionen mit denen es möglich ist, Radio-Buttons zu erzeugen:

GtkWidget *gtk_Radio_button_new(GSList  *group);

...oder mit Label...

GtkWidget *gtk_check_button_new_with_label(GSList *group, gchar *label);

Natürlich läuft dies bei Radio-Buttons etwas anders ab. Ein Radio-Button ist auch ein Teil einer Gruppe von Knöpfen, wovon immer nur einer ausgewählt werden kann. Das heißt wenn Knopf 1 ausgewählt war und sie wählen nun Knopf 2, wird Knopf 1 deaktiviert.

Daher ist es unbedingt nötig nach dem Erzeugen einer neuen Gruppe von Radion-Buttons (welche mit NULL initialisiert werden müssen), die Funktion:

GSList *gtk_radio_button_group(GtkRadioButton *radio_button);  

aufzurufen, da sich die Liste der Radio-Buttons ja geändert hat. Ansonsten gibt es keine Unterschiede zu den Toggled und Check Buttons. Standardmäßig ist immer der erste Radio-Button aktiviert. Aber ändern können sie dies, wie schon bei den Toggled Buttons. Sehen wir uns doch einfach ein Beispiel dazu an:

/*Download:gtkrd.c*/

#include <gtk/gtk.h>

GtkWidget *button1, *button2, *button3, *button_quit;

void ende_cb(GtkObject *object)
{
  g_print("\n\nZustand der Toggled Buttons zum Abschluss : \n");
 if(GTK_TOGGLE_BUTTON(button1)->active)
   g_print("Knopf 1 war aktiviert (toggled)\n");
 else
   g_print("Knopf 1 war deaktiviert (not toggled)\n");

 if(GTK_TOGGLE_BUTTON(button2)->active)
   g_print("Knopf 2 war aktiviert (toggled)\n");
 else
   g_print("Knopf 2 war deaktiviert (not toggled)\n");

 if(GTK_TOGGLE_BUTTON(button3)->active)
   g_print("Knopf 3 war aktiviert (toggled)\n");
 else
   g_print("Knopf 3 war deaktiviert (not toggled)\n");


 gtk_main_quit();
}

void check_toggle_cb(GtkWidget *widget, gpointer data)
{
 if(GTK_TOGGLE_BUTTON(widget)->active)
   g_print("%s aktiviert (toggled)\n",(char *)data);
 else
   g_print("%s deaktiviert (not toggled)\n",(char *)data);
}

int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *box;
 GSList *r_group = NULL;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_radio_button_new_with_label(r_group,"Radio 1");
 r_group = gtk_radio_button_group(GTK_RADIO_BUTTON(button1));
 button2  = gtk_radio_button_new_with_label(r_group,"Radio 2");
 r_group = gtk_radio_button_group(GTK_RADIO_BUTTON(button2));
 button3  = gtk_radio_button_new_with_label(r_group,"Radio 3");
 r_group = gtk_radio_button_group(GTK_RADIO_BUTTON(button3));
 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box = gtk_vbox_new(FALSE,0);

 /*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(button1), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 1");
 gtk_signal_connect(GTK_OBJECT(button2), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 2");
 gtk_signal_connect(GTK_OBJECT(button3), "clicked",
                    GTK_SIGNAL_FUNC(check_toggle_cb),"Knopf 3");
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Radio Buttons");
 /*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), button1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 20);

 /*Button 2 aktivieren*/
 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2),TRUE);

 gtk_container_add(GTK_CONTAINER(fenster),box);

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

 gtk_main();

 return 0;
}

Und so könnte es aussehen:




Wollen sie nachträglich einen Radio-Button zur Gruppe hinzuordnen, verwenden sie die Funktion:

void gtk_radio_button_set_group(GtkRadioButton *radio_button, GSList *group);

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf