2010-12-23 59 views
1

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

... 
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(绘制)”失败

同用一个简单的:

#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; 
} 

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

回答

2

GtkImage没有GdkWindow,所以拨打gtk_widget_get_window()或访问widget->window返回NULL。您可以将GtkImage置于GtkEventBox中,然后利用事件框的GdkWindow

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

+0

谢谢!我刚刚发现,仅仅为了使Gtk应用程序正常工作而使用现有代码进行搜索是不够的。首先尝试使用官方的[编程手册](http://developer.gnome.org/doc/GGAD/ggad.html)获取一些基本知识。 – Zurbo82 2010-12-23 22:27:45