【发布时间】:2012-02-22 12:51:49
【问题描述】:
我在这里有点发疯了。
我正在尝试使用 cairo 在我的 GTK 表单上绘制一些简单的图形。
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
这编译,但给了我
Gdk-CRITICAL **: IA__gdk_cairo_create: 断言`GDK_IS_DRAWABLE (drawable)'失败
后跟一个段错误。
我一直在看tutorial here
所以我改变了我的代码如下,使开罗调用发生在暴露事件中。
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
g_signal_connect(darea, "expose-event",
G_CALLBACK(on_expose_event), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
为什么这会解决它? 我的理解是:暴露是:
g_signal_connect(darea, "expose-event", G_GCALLBACK(on_expose_event), NULL);
告诉程序,'当一个暴露事件发生在darea时,然后调用on_expose_event'。 null 是您可以将指针传递给函数以供使用的附加信息结构的位置。
和
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
意味着 on_expose_event 被传递一个指向事件发生的小部件的指针,在这种情况下,因为它是一个暴露事件,一个指向包含有关暴露事件信息的结构的指针,以及一个指向任何其他信息的结构的指针您可能想添加。
【问题讨论】: