2011-12-02 53 views
0

我正在做一个板这样知道哪个按钮被按下了! GTK

GtkWidget *board[x][y]; 

如果我做按钮的排列,我怎么能知道哪个按钮被按下?

是否阵列的

g_signal_connect(G_OBJECT(board[][]), "clicked", 
     G_CALLBACK(board_button_pressed), NULL); 
// I want to know what [][] they pressed, how could I verify/check this? 

回报哪个按钮被按下?或者,我是否必须为每个棋子单独制作一个功能?

例如:

OOO 
OXO 
OOO 

如何知道哪个按钮被按下,如果所有的按钮被命名一样吗?

回答

2

最简单的方法之一就是在连接到回调数据时发送信息。一些在这些线路上:

... 

typedef struct _identifier{ 
    int x; 
    int y; 
}identifier; 

static void button_clicked_cb(GtkButton *button, gpointer data) 
{ 
    (void)button; /*To get rid of compiler warning*/ 
    identifier *id = data; 
    printf("\n id = %d, %d\n", id->x, id->y); 
    return; 
} 
.... 
    identifier id[x*y]; /* Size of x*y of the board*/ 
    unsigned int counter = 0; 
    for (i = 0; i < x; i++) 
    { 
     for (j = 0; j < y; j++) 
     { 
      id[counter].x = i; 
      id[counter].y = j; 
      board[i][j] = gtk_button_new(); 
      g_signal_connect(board[i][j], "clicked", G_CALLBACK(button_clicked_cb), &id[counter]); 
      counter++; 
     }                                      
    } 

请注意:"clicked"信号只与GtkButton有关。如果您需要使用GtkWidget,请查看"button-press-event""button-release-event",在这种情况下,回调签名也会发生变化。
希望这有助于!

+0

给我一秒,我会试试看,看看会发生什么,感谢您的帮助! – drodri420

+0

我seee标识符* id =数据; “数据”代表什么? – drodri420

+0

'data'是传递给回调函数的参数。您可以设置使用'g_signal_connect'连接时要传递的数据 –

相关问题