gtk2 expose-event不能与destroy一起使用

时间:2018-03-28 21:49:09

标签: gtk gtk2

我正在使用gtk2进行项目。有一个窗口包含一些动画。 我遵循了一些教程,但我已经走到了尽头:

static gboolean time_handler(GtkWidget *widget)
{
 gtk_widget_queue_draw(widget);
 return true;
}

static void paint (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
    cairo_t *cr;
    cr = gdk_cairo_create (gtk_widget_get_window(widget));
    printf("this is numb ");

    cairo_stroke (cr);
    cairo_destroy (cr);
}

int main(int argc, char **argv) {
argC = argc; argV = argv;

  GtkWidget *window;
  GtkWidget *darea;
  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  darea = gtk_drawing_area_new ();

  GtkWidget *button;

  darea = gtk_drawing_area_new ();

  g_signal_connect (G_OBJECT(window), "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);

  gtk_window_set_title(GTK_WINDOW(window), "mazas demo");
  gtk_window_set_default_size(GTK_WINDOW(window), 600, 400);
  gtk_container_set_border_width(GTK_CONTAINER(window), 15);

  g_timeout_add(1, (GSourceFunc) time_handler, (gpointer) window);  

  gtk_widget_show_all(window);

  g_signal_connect_after (G_OBJECT(window),"expose-event",
                        G_CALLBACK(paint), window);

  gtk_main();

  return 0;
}

当我编译时,我卡住了static void paint,当我尝试退出显示的程序时终端说:

$ Gtk-CRITICAL **: IA__gtk_widget_queue_draw: assertion 'GTK_IS_WIDGET (widget)' failed

1 个答案:

答案 0 :(得分:0)

GTK + 2现在已经过时了。如果您正在学习GTK +,请学习GTK + 3.

至于你的问题,paint函数应返回gboolean来说明是否需要传播事件。当你处理它时,你应该返回FALSEFALSE(大写)是gboolean。出于同样的原因,time_handler应该返回TRUE,而不是true。但是你甚至没有放入你的包含,因此#include <gtk/gtk.h>丢失了,除非你true,否则#include <stdbool.h>也没有被定义。

你还以1毫秒的间隔调用g_timeout_add,这个间隔太小,因为我怀疑你的屏幕能够以100Hz的频率显示图像。如果您重复此行,您也会泄漏内存:

darea = gtk_drawing_area_new ();

接下来,您忘了将绘图区域放在窗口内。你应该添加:

gtk_container_add(GTK_CONTAINER(window), darea);

接下来,您应该连接到绘图区域的expose事件(因为我想要绘制它的位置),而不是窗口1:

g_signal_connect_after (G_OBJECT(window),"expose-event",
                        G_CALLBACK(paint), darea);