







|

Sie haben nun schon gesehen, wie man einfache Buttons erstellen kann:
GtkWidget *gtk_button_new(void); /*Button ohne Aufschrift*/
...oder...
GtkWidget *gtk_button_new_with_label(const gchar *label);
Nun will man aber schon wissen, welche Button gedrückt wurde und wie man
das feststellen kann. Sicherlich gibt es da einige Wege. Wir wollen
hier einen davon Demonstrieren. Hierzu ein simples Beispiel dazu:
/*Download:gtkbut1.c*/
#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>
#include <string.h>
void ende_cb(GtkObject *object)
{
g_print("Und Tschüss!!\n");
gtk_main_quit();
}
void check_button_press_cb(GtkWidget *widget, gpointer data)
{
if(strcmp("Button 1", (char *)data) == 0)
g_print("Button 1 wurde gedrückt\n");
else if(strcmp("Button 2", (char *)data) == 0)
g_print("Button 2 wurde gedrückt\n");
else if(strcmp("Button 3", (char *)data) == 0)
g_print("Button 3 wurde gedrückt\n");
else if(strcmp("Button 4", (char *)data) == 0)
g_print("Button 4 wurde gedrückt\n");
else
g_print("%s\n",(char *)data);
}
int main(int argc, char **argv)
{
GtkWidget *fenster;
GtkWidget *button1, *button2, *button3, *button4;
GtkWidget *table;
/*Gtk initialisieren*/
gtk_init(&argc, &argv);
/*Ein neues Fenster erstellen*/
fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*Buttons erstellen*/
button1 = gtk_button_new_with_label("Button 1");
button2 = gtk_button_new_with_label("Button 2");
button3 = gtk_button_new_with_label("Button 3");
button4 = gtk_button_new_with_label("Button 4");
/*Tabelle erstellen... 2x2*/
table = gtk_table_new(2,2,FALSE);
/*Signale registrieren*/
gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
GTK_SIGNAL_FUNC(ende_cb), NULL);
gtk_signal_connect(GTK_OBJECT(button1), "clicked",
GTK_SIGNAL_FUNC(check_button_press_cb),"Button 1" );
gtk_signal_connect(GTK_OBJECT(button2), "clicked",
GTK_SIGNAL_FUNC(check_button_press_cb), "Button 2");
gtk_signal_connect(GTK_OBJECT(button3), "clicked",
GTK_SIGNAL_FUNC(check_button_press_cb),"Button 3" );
gtk_signal_connect(GTK_OBJECT(button4), "clicked",
GTK_SIGNAL_FUNC(check_button_press_cb), "Button 4");
/*Fenstertitel*/
gtk_window_set_title(GTK_WINDOW(fenster), "Welcher Button wurde gedrückt");
/*Fensterposition*/
gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(fenster),40);
/*Inhalt der Tabelle mit verschiedenen Optionen erstellen....*/
gtk_table_attach_defaults(GTK_TABLE(table), button1, 0,1, 0,1);
gtk_table_attach_defaults(GTK_TABLE(table), button2, 0,1, 1,2);
gtk_table_attach_defaults(GTK_TABLE(table), button3, 1,2, 0,1);
gtk_table_attach_defaults(GTK_TABLE(table), button4, 1,2, 1,2);
gtk_container_add(GTK_CONTAINER(fenster),table);
/*Zeigs uns.....*/
gtk_widget_show_all(fenster);
gtk_main();
return 0;
}
|
Bei diesem Beispiel wird jedes Button-"clicked" auf der Konsole mit entsprechenden
Button ausgegeben. Bitte verwenden sie g_print anstatt printf, da sie sonst
Probleme mit der Ausgabe haben werden, wegen der Pufferung von printf.
Natürlich wird in der Praxis nicht so reagiert. Sie könnten Beispielsweise
eine neuen Prozess mit fork erzeugen und ein anderes Programm aufrufen.
Sie können auch Theoretisch das Signal "clicked" für einen Button auslösen,
ohne das wirklich ge"clicked" wurde mit:
void gtk_button_clicked(GtkButton *button);
Ebenso können sie mit den Funktionen:
void gtk_button_pressed(GtkButton *button);
void gtk_button_enter(GtkButton *button);
void gtk_button_released(GtkButton *button);
void gtk_button_leave(GtkButton *button);
weiter Events also Signale senden.
Es ist auch möglich, dass aussehen Ihres Buttons zu beeinflussen mit der
Funktion:
void gtk_button_set_relief(GtkButton *button, GtkReliefStyle newstyle);
Damit hat der Button das Aussehen von newstyle, wofür sie folgendes angeben können:
- GTK_RELIEF_NORMAL (Standard)
- GTK_RELIEF_NONE (kein Button)
- GTK_RELIEF_HALF (halb)
Sie können dies ja bei unserem Programmbeispiel oben testen mit:
gtk_button_set_relief(GTK_BUTTON(button2), GTK_RELIEF_NONE);
für Button 2 zum Beispiel.
Wollen sie aber zum Beispiel ein Jpeg oder Xpm - Bild auf dem Button anzeigen
benötigen sie eine Funktion der gdk-Lib. Aber dazu kommen wir noch.
Folgende Signale können sie übrigens mit einem Button senden:
- pressed - wird gesendet wenn der Button gedrückt und wieder losgelassen wurde
- released - wird gesendet wenn der Button nach dem Drücken losgelassen wurde
- clicked - wird gesendet wenn der Button gedrückt wurde
- enter - wird gesendet wenn der Mauszeiger über dem Button ist (Mouse over)
- leave - wird gesendet, wenn der Mauszeiger sich vom Button entfernt (Mouse out)
Auch hier empfehle ich Ihnen mit den Events im Programm oben herumzuspielen.

© 2001,2002 Jürgen Wolf
|