Program w C z biblioteką GTK

0

Witam
To mój pierwszy program z graficznym interfejsem, napisałem funkcje tworzącą jedną tabele (do gry w statki) :

 void pisz(int i,int j)
{
    g_print("Zniszczono przycisk %d %d\n",i,j);
}
void tworz_tabele(GtkWidget **tabela)
{
  GtkWidget *button;
  int i, j;
  *tabela = gtk_table_new(11,11,1);
  char znak1[]="@", znak2[]="0 ";
  for(i=0;i<11;i++)
    for(j=0;j<11;j++)
      {
        if((i==0)&&(j!=0))
        {
            znak1[0]=znak1[0]+1;
            button=gtk_button_new_with_label(znak1);
        }
        else if((i!=0)&&(j==0))
            {
                znak2[0]=znak2[0]+1;
                if(znak2[0]==':')
                    {
                        znak2[0] = '1';
                        znak2[1] = '0';
                    }
                button=gtk_button_new_with_label(znak2);
            }
             else
             {
                 button = gtk_button_new();
                 gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(pisz(i,j)),NULL);  //pokazuje błąd
             }                                                                                //nie moge przekazac parametrow funkcji
    gtk_table_attach(GTK_TABLE(*tabela),button,i,i+1,j,j+1,GTK_FILL,GTK_FILL,1,1);
    gtk_widget_show(button);


      }
      gtk_widget_show(*tabela);
}

Problem polega na tym że nie wiem jak sprawić aby po wciśnięciu guzika przekazał on do funkcji którą wywoła numer wiersza i kolumny w której się znajduje. Próbowałem to zrobić tak ja to jest w kodzie ale kompilator tego nie przyjmuje.
Oraz czy mógł by mi ktoś powiedzieć jak usunąć przycisk który zostanie wciśnięty(żeby potem dodać w to miejsce nowy z etykietom (czy pod przyciskiem krył się statek czy nie) .
Do usunięcia przycisku chciałem użyć funkcji wywołanej przez ten przycisk, czyli sprawdzić czy jest statek, usunąć przycisk, wpisać nowy ale nie moge znaleŹć żadnej funkcji w stylu delete(button); ani też przekazać wskaźnika na przycisk, jego pozycji w tabeli żeby na to miejsce wstawić nowy.

0

pomoże ktoś

0

Utwórz strukturę i przekaż ją jako user data.

0

Ale jak, gdy wklejam W NULL jakas zmienna to mi funkcja głupoty odczytuje

gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(pisz(i,j)),NULL); 
0

No chyba że to int wtedy dobrze odczytuje ale jeden parametr to za mało

0

Pokaż, jak to robisz ze wskaźnikiem na strukturę.

0

cały kod jaki do tej pory napisałem :

#include <stdlib.h>
#include <gtk/gtk.h>

struct pozycja{
int x;
int y;};

 void pisz(GtkWidget *widget,GdkEvent *event, struct pozycja *data)
{
    int i, j;
    i = data->x;
    j = data->y;
    g_print("Zniszczono przycisk %d %d\n",i,j);
}

void destroy( GtkWidget *widget, gpointer data )
 {
  gtk_main_quit();
 }



void tworz_tabele(GtkWidget **tabela)
{

  GtkWidget *button;
  int i, j;
  *tabela = gtk_table_new(11,11,1);
  struct pozycja zmienna;
  char znak1[]="@", znak2[]="0 ";
  for(i=0;i<11;i++)
    for(j=0;j<11;j++)
      {
        if((i==0)&&(j!=0))
        {
            znak1[0]=znak1[0]+1;
            button=gtk_button_new_with_label(znak1);
        }
        else if((i!=0)&&(j==0))
            {
                znak2[0]=znak2[0]+1;
                if(znak2[0]==':')
                    {
                        znak2[0] = '1';
                        znak2[1] = '0';
                    }
                button=gtk_button_new_with_label(znak2);
            }
             else
             {
                 button = gtk_button_new();
                 zmienna.x = i;
                 zmienna.y = j;
                 gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(pisz),&zmienna);
             }
    gtk_table_attach(GTK_TABLE(*tabela),button,i,i+1,j,j+1,GTK_FILL,GTK_FILL,1,1);
    gtk_widget_show(button);


      }
      gtk_widget_show(*tabela);
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *tabela1, *tabela2,*tabela3, *tabela;
    GtkWidget *button;

    gtk_init(&argc, &argv);  //Obs³uga parametrów programu

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //utworzenie nowego okna

    gtk_window_set_title(GTK_WINDOW(window),"STASTKI");

    tabela3= gtk_table_new(4,1,1); //menu
    button = gtk_button_new_with_label("Nowa gra"); //przycisk nowej gry
    gtk_table_attach(GTK_TABLE(tabela3),button,0,1,1,2,GTK_EXPAND,GTK_EXPAND,0,0);
    gtk_widget_show(button);
    button = gtk_button_new_with_label("START");    //przycisk zaczêcia rozgrywki
    gtk_table_attach(GTK_TABLE(tabela3),button,0,1,2,3,GTK_EXPAND,GTK_EXPAND,0,0);
    gtk_widget_show(button);
    gtk_widget_show(tabela3);


    tabela = gtk_table_new(1,3,1);

    tworz_tabele(&tabela1); //plansza gracza
    tworz_tabele(&tabela2); //plansza przeciwnika
    gtk_table_attach(GTK_TABLE(tabela),tabela1,0,1,0,1,GTK_FILL,GTK_FILL,0,0);
    gtk_table_attach(GTK_TABLE(tabela),tabela3,1,2,0,1,GTK_FILL,GTK_FILL,0,0);
    gtk_table_attach(GTK_TABLE(tabela),tabela2,2,3,0,1,GTK_FILL,GTK_FILL,0,0);

    gtk_container_add(GTK_CONTAINER(window), tabela);
    gtk_widget_show(tabela);
    gtk_widget_show(window);    //Pokazujemy okno
    gtk_main ();
    return 0;
}

 
0

W tej wersji program się po prostu wywala przy wciśnięciu na przycisk

0

No bo musisz utworzyć wskaźnik na tę strukturę, a nie przekazywać zmienną.

0

A jak to zrobić, to mój pierwszy program w tym języku.

0

Według mnie to tak :

 #include <stdlib.h>
#include <gtk/gtk.h>

struct pozycja{
int x;
int y;};

 void pisz(GtkWidget *widget,GdkEvent *event, struct pozycja *data)
{
    int i, j;
    i = data->x;
    j = data->y;
    g_print("Zniszczono przycisk %d %d\n",i,j);
}

void destroy( GtkWidget *widget, gpointer data )
 {
  gtk_main_quit();
 }



void tworz_tabele(GtkWidget **tabela)
{

  GtkWidget *button;
  int i, j;
  *tabela = gtk_table_new(11,11,1);
  struct pozycja *zmienna;
  char znak1[]="@", znak2[]="0 ";
  for(i=0;i<11;i++)
    for(j=0;j<11;j++)
      {
        if((i==0)&&(j!=0))
        {
            znak1[0]=znak1[0]+1;
            button=gtk_button_new_with_label(znak1);
        }
        else if((i!=0)&&(j==0))
            {
                znak2[0]=znak2[0]+1;
                if(znak2[0]==':')
                    {
                        znak2[0] = '1';
                        znak2[1] = '0';
                    }
                button=gtk_button_new_with_label(znak2);
            }
             else
             {
                 button = gtk_button_new();
                 zmienna->x = i;
                 zmienna->y = j;
                 gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(pisz),zmienna);
             }
    gtk_table_attach(GTK_TABLE(*tabela),button,i,i+1,j,j+1,GTK_FILL,GTK_FILL,1,1);
    gtk_widget_show(button);


      }
      gtk_widget_show(*tabela);
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *tabela1, *tabela2,*tabela3, *tabela;
    GtkWidget *button;

    gtk_init(&argc, &argv);  //Obs³uga parametrów programu

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //utworzenie nowego okna

    gtk_window_set_title(GTK_WINDOW(window),"STASTKI");

    tabela3= gtk_table_new(4,1,1); //menu
    button = gtk_button_new_with_label("Nowa gra"); //przycisk nowej gry
    gtk_table_attach(GTK_TABLE(tabela3),button,0,1,1,2,GTK_EXPAND,GTK_EXPAND,0,0);
    gtk_widget_show(button);
    button = gtk_button_new_with_label("START");    //przycisk zaczêcia rozgrywki
    gtk_table_attach(GTK_TABLE(tabela3),button,0,1,2,3,GTK_EXPAND,GTK_EXPAND,0,0);
    gtk_widget_show(button);
    gtk_widget_show(tabela3);


    tabela = gtk_table_new(1,3,1);

    tworz_tabele(&tabela1); //plansza gracza
    tworz_tabele(&tabela2); //plansza przeciwnika
    gtk_table_attach(GTK_TABLE(tabela),tabela1,0,1,0,1,GTK_FILL,GTK_FILL,0,0);
    gtk_table_attach(GTK_TABLE(tabela),tabela3,1,2,0,1,GTK_FILL,GTK_FILL,0,0);
    gtk_table_attach(GTK_TABLE(tabela),tabela2,2,3,0,1,GTK_FILL,GTK_FILL,0,0);

    gtk_container_add(GTK_CONTAINER(window), tabela);
    gtk_widget_show(tabela);
    gtk_widget_show(window);    //Pokazujemy okno
    gtk_main ();
    return 0;
}

Ale teraz to się nawet menu nie pokazuje od razu jest błąd :-(

1 użytkowników online, w tym zalogowanych: 0, gości: 1