Login
Newsletter
Werbung

So, 5. Dezember 1999, 00:00

GTK Workshop: Teil IV

Toggle Buttons

Toggle Buttons sind zu den normalen Buttons eigentlich nicht sehr verschieden. Der einzige Unterschied ist, daß sie entweder gedrückt sein können oder nicht. Der Status (gedrückt/nicht gedrückt) wird durch einfaches Klicken geändert. Toggle Buttons bilden die Basis für Radio Buttons und Check Buttons. So können die meisten Funktions-Aufrufe für Toggle Buttons auch für Radio Buttons und Check Buttons benutzt werden. Bei der Erstellung von Buttons gibt es wieder zwei Möglichkeiten, entweder mit oder ohne Label:

GtkWidget *gtk_toggle_button_new( void );
GtkWidget *gtk_toggle_button_new_with_label( gchar *label );

So sind die beiden Funktionen definiert. Beide arbeiten wie die Funktionen für die normalen Buttons. Um den Status eines Toggle Buttons herauszufinden (Radio und Check Buttons inbegriffen), können wir eine einfache GTK-Definition benutzen. Wenn ein Toggle/Radio/Check Button geändert wird, gibt er das Signal toggled zurück. Um dann den Status herauszufinden, braucht man nur einen Signalhandler (Callbacks siehe Teil II) zu setzen, der auf eine Funktion wie die folgende zeigt:

void toggle_button_callback( GtkWidget *widget, gpointer data )
{
 if( GTK_TOGGLE_BUTTON( widget )->active)
 {
/* Das wird ausgeführt wenn 'widget' (der Toggle Button) aktiviert ist */
 }
 else
 {
/* Und das wird gemacht wenn er nicht aktiviert ist */
 }
}

Jetzt kommen wir zu einer anderen Funktion für Toggle Buttons:

void gtk_toggle_button_set_active( GtkToggleButton *toggle_button, gint state );

Das kann benutzt werden, um den Status eines Toggle-Buttons zu setzen. Der erste Parameter ist dabei der Toggle Button, der geändert werden soll. Der zweite Parameter ist der Status, entweder TRUE oder FALSE. Wenn der Button durch dieses Signal geändert wird, wird der Button das clicked-Signal zurückgeben.

void gtk_toggle_button_toggled (GtkToggleButton *toggle_button);

Diese Funktion wechselt einfach den Status und gibt das toggled-Signal.

Check Buttons

Check Buttons sind eigentlich das Gleiche wie Toggle Buttons. Der einzige Unterschied ist ihr Aussehen. Während die anderen Buttons den Text in sich drin tragen, sind Check Buttons eine kleine Fläche, deren Text rechts daneben steht. Check Buttons werden meistens dazu verwendet, Optionen ein- und auszuschalten. Check Buttons können mit folgenden Funktionen erstellt werden (sind gleich mit den Funktionen normaler Buttons):

GtkWidget *gtk_check_button_new( void );
GtkWidget *gtk_check_button_new_with_label( gchar *label );

Der Rest ist genau das gleiche wie bei den Toggle Buttons.

Radio Buttons

Radio Buttons sind wie Check Buttons, jedoch liegt der Unterschied darin, daß Radio Buttons immer in Gruppen zusammengestellt werden, und nur ein Button einer Gruppe aktiviert sein kann. Radio Buttons werden mit einer der beiden Funktionen erstellt:

GtkWidget *gtk_radio_button_new( GSList *group );
GtkWidget *gtk_radio_button_new_with_label( GSList *group, gchar *label );

Sie werden bestimmt den Extra-Parameter bemerkt haben. Hier wird der Name der Gruppe eingetragen. Beim ersten Benutzen von gtk_radio_button_new() oder gtk_radio_button_new_with_label() sollte der erste Parameter NULL sein. Danach kann man eine Gruppe erstellen:

GSList *gtk_radio_button_group( GtkRadioButton *radio_button );

Diese Funktion muss bei jedem neu erstellten Radio Button neu aufgerufen werden, und zwar mit dem Vorgänger-Button als Parameter. Die Rückgabe von gtk_radio_button_group() muss dann an gtk_radio_button_new() oder gtk_radio_button_new_with_label() weitergegeben werden. Das untenstehende Beispiel wird mehr Klarheit schaffen :-). Aber diese Syntax sollte einiges erleichtern, sie wird auch im Beispiel verwendet:

button2 = gtk_radio_button_new_with_label(
 gtk_radio_button_group(GTK_RADIO_BUTTON (button1)),
 "button2");

Mit dem Aufruf folgender Funktion kann man bestimmen, welcher Button vorausgewählt sein soll:

void gtk_toggle_button_set_active( GtkToggleButton *toggle_button, gint state );

Diese Funktion ist bei den Toggle Buttons beschrieben und muss hier genauso eingesetzt werden. Jetzt kommt das Beispiel:

#include <gtk/gtk.h>
int main( int argc, char *argv[] )
{
 GtkWidget *window;
 GtkWidget *box;
 /* Hier werden die drei Radio Buttons deklariert */
 GtkWidget *radio_button1;
 GtkWidget *radio_button2;
 GtkWidget *radio_button3;
 gtk_init( &argc, &argv );
 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /* siehe Teil 3 des GTK-Workshops */
 box = gtk_vbox_new( FALSE, 0 );
 /* Jetzt kommt's neue. Beim ersten Aufruf ist das erste Argument NULL! */
 radio_button1 = gtk_radio_button_new_with_label( NULL, "Option 1" );
 /* Ab jetzt müssen wir die Gruppe angeben */
 radio_button2 = gtk_radio_button_new_with_label(
 gtk_radio_button_group( GTK_RADIO_BUTTON( radio_button1 )),
 "Option 2");
 radio_button3 = gtk_radio_button_new_with_label(
 gtk_radio_button_group( GTK_RADIO_BUTTON( radio_button2 )),
 "Option 3");
 /* Um noch mehr zu demonstrieren, wird der zweite Button angemacht */
 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( radio_button2 ), TRUE );
 /* Jetzt noch alles schön zusammenpacken :-) */
 gtk_box_pack_start( GTK_BOX( box ), radio_button1, FALSE, FALSE, 2);
 gtk_box_pack_start( GTK_BOX( box ), radio_button2, FALSE, FALSE, 2);
 gtk_box_pack_start( GTK_BOX( box ), radio_button3, FALSE, FALSE, 2);
 /* Und die Box kommt in den Fenster-Container */
 gtk_container_add( GTK_CONTAINER( window ), box );
 /* alles wird angezeigt */
 gtk_widget_show_all( window );
 gtk_main();
 return 0;
}

Es sollten dann nach dem Start des Programmes drei Radio-Buttons zu sehen sein, von denen der zweite aktiviert ist:

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung