我正在使用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
答案 0 :(得分:0)
GTK + 2现在已经过时了。如果您正在学习GTK +,请学习GTK + 3.
至于你的问题,paint
函数应返回gboolean
来说明是否需要传播事件。当你处理它时,你应该返回FALSE
。 FALSE
(大写)是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);