2013-02-11 19 views
0

当程序最初运行时,打印语句打印出与指针对应的有效十六进制代码。但是,当我点击屏幕,并通过'clicked'回调调用handleClick方法时,0x0被打印到屏幕上。发生了什么?为什么我的Board对象突然变为空?无法将自变量传递给GTK回调

#include <stdio.h> 
#include <stdlib.h> 
#include <gtk/gtk.h> 
#include "board.h" 

void printBoard(Board *board); 
void handleClick(GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data); 

    gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data) 
    { 
    Board *temp = (Board *)data; 
    printf("%p\n",temp); 
    return TRUE; 
    } 

    void handleClick (GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data) 
    { 
    Board *temp = (Board *)data; 
    printf("%p\n",temp); 
    } 

    void start(Board *newBoard) 
    { 
     GtkWidget *window; 
     GtkWidget *da; 
     GtkWidget *frame; 

     window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
     char string[40]; 
     snprintf(string, sizeof(string), "Connect %d-%d",newBoard->k,newBoard->n); 

     gtk_window_set_default_size (GTK_WINDOW(window), 400, 400); 
     gtk_window_move(GTK_WINDOW(window), 100, 100);  
     g_signal_connect (GTK_WINDOW(window), "destroy", G_CALLBACK (gtk_main_quit), NULL); 

     da = gtk_drawing_area_new(); 
     gtk_widget_set_size_request (da, 500, 500); 

     frame = gtk_frame_new (NULL); 
     gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); 
     gtk_container_add (GTK_CONTAINER (window), frame); 

     gtk_container_add (GTK_CONTAINER (frame), da); 

     gtk_widget_set_events (da, gtk_widget_get_events (da) 
        | GDK_BUTTON_PRESS_MASK); 

     g_signal_connect (da, "draw", 
       G_CALLBACK (draw_cb), newBoard); 

     g_signal_connect (da, "button-press-event", 
       G_CALLBACK (handleClick), newBoard); 

     gtk_widget_show_all (window); 
    } 

回答

1

button-press-event信号处理程序的原型是以下根据reference manual

gboolean user_function (GtkWidget *widget, 
         GdkEvent *event, 
         gpointer user_data) 

如果从​​功能data删除cairo_t *cr参数都会好的。

0

正如Szilard所说,您使用​​功能的错误原型。

button-press-event信号处理函数的原型如下:

gboolean user_function (GtkWidget *widget, 
         GdkEvent *event, 
         gpointer user_data) 

要修正自己的错误,你需要:

  • 删除cairo_t *cr参数。它正在收到价值data
  • 固定event类型是GdkEvent *,不GdkEventButton *
  • 修复返回值,这是一个布尔值,而不是无效的,而且这是很重要的,以确定该事件被传播或没有。
+1

无需修复'GdkEvent':它是不同事件结构的联合体,'GdkEventButton'就是其中之一。 – ntd 2013-02-17 11:00:52