如何从Cairo上下文创建GtkImage?

时间:2010-12-23 18:32:06

标签: gtk cairo

我有一个使用Cairo上下文工作的绘制函数,最终结果应该是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__gdk_cairo_create:断言`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;
}

我不明白为什么会失败。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

GtkImage没有GdkWindow,因此对gtk_widget_get_window()的调用或widget->window的访问权返回NULL。您可以将GtkImage放在GtkEventBox中,并在事件框的GdkWindow上绘图。

虽然,看起来你正在尝试(用gdk_pixbuf_new)创建一个空白的空间来绘制。在这种情况下,GtkImage不是您想要的小部件 - 使用GtkDrawingArea。并且不要忘记在event-expose信号的处理程序中调用您的绘制函数!