我有点失去理智了。
我正在尝试使用 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
(可绘制)'失败
随后出现段错误。
我一直在看教程在这里
所以我按如下方式更改了代码,使 cairo 调用发生在公开事件内。
#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 是您可以传递指向附加信息结构的指针以供函数使用的地方。
and
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
意味着 on_expose_event 被传递一个指向事件发生的小部件的指针,在这种情况下,因为它是一个公开事件,一个指向包含有关公开事件信息的结构的指针,以及一个指向您可能喜欢的任何其他信息的结构的指针加上。