我有一个使用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;
}
我不明白为什么会失败。任何帮助表示赞赏!
答案 0 :(得分:2)
GtkImage
没有GdkWindow
,因此对gtk_widget_get_window()
的调用或widget->window
的访问权返回NULL
。您可以将GtkImage
放在GtkEventBox
中,并在事件框的GdkWindow
上绘图。
虽然,看起来你正在尝试(用gdk_pixbuf_new
)创建一个空白的空间来绘制。在这种情况下,GtkImage
不是您想要的小部件 - 使用GtkDrawingArea
。并且不要忘记在event-expose
信号的处理程序中调用您的绘制函数!