T
Ok tut mir Leid
das mit dem Casten hat sich geklärt, und jetzt werden auch alle Buttons gezeigt!
Hier der funktionierende Code:
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtkwidget.h>
void delete_event(GtkWidget *widget, GdkEvent event, gpointer data)
{
gtk_main_quit();
}
void ausgabe(int i, int n)
{
g_print("Button %i:%i wurde geklickt\n", i, n);
}
int main( int argc, char *argv[] )
{
GtkWidget *spielerfeld = NULL;
GtkWidget *gegnerfeld = NULL;
GtkWidget *window = NULL;
GtkWidget *buttonArray_s[10][10];
GtkWidget *buttonArray_g[10][10];
GtkWidget *hbox;
GtkWidget *optionen_but;
GtkWidget *image_feld_s[10][10];
GtkWidget *image_feld_g[10][10];
GtkAllocation child_allocation;
int feldgroesse = 10;
int i;
int n;
gtk_init(&argc, &argv);
printf("\n Z36: window = %p\n", window);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
printf("\n Z38: window = %p\n", window);
/* Zuweisungen */
printf("\n Z40: spielerfeld = %p\n", spielerfeld);
spielerfeld = gtk_table_new(feldgroesse, feldgroesse, FALSE);
printf("\n Z42: spielerfeld = %p\n", spielerfeld);
printf("\n Z43: gegnerfeld = %p\n", gegnerfeld);
gegnerfeld = gtk_table_new(feldgroesse, feldgroesse, FALSE);
printf("\n Z43: gegnerfeld = %p\n", gegnerfeld);
hbox = gtk_hbox_new(FALSE, 70);
gtk_window_set_title(GTK_WINDOW(window), "Spielfeld");
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
child_allocation.height = 20;
child_allocation.width = 20;
/* Schleife um 10x10 Buttons zu erstellen und mit signalen zu versehen
* edit: signale gehen noch nicht
* --> SPIELER */
for(n = 0; n < feldgroesse; n++)
{
for(i = 0; i < feldgroesse; i++)
{
image_feld_s[n][i] = gtk_image_new_from_file("/home/schuller/workspace/wave.gif");
buttonArray_s[n][i] = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(buttonArray_s[n][i]), image_feld_s[n][i]);
gtk_table_attach_defaults(GTK_TABLE(spielerfeld), buttonArray_s[n][i], i, i + 1, n, n + 1 /*, 0, 0, 0, 0*/ );
gtk_widget_show (buttonArray_s[n][i]);
}
}
/* Schleife um 10x10 Buttons zu erstellen und mit signalen zu versehen
* edit: signale gehen noch nicht
* --> GEGNER */
for(n = 0; n < feldgroesse; n++)
{
for(i = 0; i < feldgroesse; i++)
{
image_feld_g[n][i] = gtk_image_new_from_file("/home/schuller/workspace/wave.gif");
buttonArray_g[n][i] = gtk_button_new();
gtk_table_attach_defaults( GTK_TABLE(gegnerfeld), buttonArray_g[n][i], i, i + 1, n, n + 1 /*, 0, 0, 0, 0*/ );
gtk_button_set_image(GTK_BUTTON(buttonArray_g[n][i]), image_feld_g[n][i]);
gtk_widget_show (buttonArray_g[n][i]);
}
}
optionen_but = gtk_button_new_with_label("Optionen");
gtk_widget_size_allocate (GTK_BIN (optionen_but)->child, &child_allocation);
gtk_box_pack_start(GTK_BOX(hbox), spielerfeld, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), optionen_but, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), gegnerfeld, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), hbox);
/* Jetzt kommen wieder die üblichen Beendigungs-Callbacks */
gtk_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(delete_event), NULL);
gtk_signal_connect_object(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit),
GTK_OBJECT(window));
/* alles was auf window ist, wird angezeigt */
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Nun werde ich mich darum kümmern, dass bei "clicked" sich das Bild ändert. Optional, für spätere Vereifachung, packe ich die Spieler-relevanten Felder und Gegner-relevanten Felder in structs, so muss ich Später nicht immer alles neuschreiben, und auch nicht immer neue Argumente an Funktionen hinzufügen, falls ein neues Feld (o.Ä.) hinzukommt.
Danke für eure Hilfe!
Ihr seid Spitze
Marius