如何从Cairo上下文创建GtkImage?

如何从Cairo上下文创建GtkImage?,gtk,cairo,Gtk,Cairo,我得到了一个使用Cairo上下文的paint函数,最终结果应该是一个GtkImage(没有中间图像创建)。我尝试使用gdk_cairo_create函数,但以下代码: ... GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 22, 22); GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf); GdkDrawable *drawable = image-&g

我得到了一个使用Cairo上下文的paint函数,最终结果应该是一个GtkImage(没有中间图像创建)。我尝试使用gdk_cairo_create函数,但以下代码:

...
GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 22, 22);
GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
GdkDrawable *drawable = image->window;
cairo_t *ctx = gdk_cairo_create (drawable);
my_cairo_paint_function (ctx);
...
在以下情况下失败:

Gdk CRITICAL**:IA_ugdk_cairo_create:assertion`Gdk_IS_DRAWABLE(DRAWABLE)`失败

同一个简单的例子:

#include <gtk/gtk.h>
#include <cairo.h>

int
main (int argc, char *argv[])
{
  gtk_init(&argc, &argv);
  cairo_t *ctx = gdk_cairo_create (gtk_widget_get_window (gtk_image_new_from_file ("foobar.png")));
  gtk_main();
  return 0;
}
#包括
#包括
int
main(int argc,char*argv[])
{
gtk_init(&argc,&argv);
cairo_t*ctx=gdk_cairo_create(gtk_widget_get_window(gtk_image_new_from_file(“foobar.png”));
gtk_main();
返回0;
}

我不明白这为什么会失败。感谢您的帮助

GtkImage
没有
GdkWindow
,因此调用
gtk\u widget\u get\u window()
或访问
widget->window
返回
NULL
。您可以将
GtkImage
放入
GtkEventBox
中,并在事件框的
GdkWindow
上绘制


尽管如此,看起来您正在尝试(使用
gdk_pixbuf_new
)创建一个空白空间来进行绘制。在这种情况下,
GtkImage
不是您想要的小部件——请使用
gtkdrawingara
。不要忘记在处理程序中为
事件expose
信号调用paint函数

谢谢!我刚刚艰难地发现,仅仅通过谷歌搜索现有代码来让Gtk应用程序工作是不够的。我会先用官方的资料试着了解一些基本知识。那本手册真的很旧。正如您从的首页所看到的,他们正在开发一个新的开发人员站点。这个存储库中应该有一些由有能力的人编写的新编程示例:这些示例将在新网站上发布,但我还没有真正研究过它们,所以我不能说它们的发展有多快。