Как создать GtkImage из контекста Каира? - PullRequest
1 голос
/ 23 декабря 2010

Я получил функцию рисования, которая работает с использованием контекста 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 Ответ

2 голосов
/ 24 декабря 2010

GtkImage не имеет GdkWindow, поэтому вызов gtk_widget_get_window() или доступ widget->window возвращает NULL. Вы можете поместить GtkImage в GtkEventBox и нарисовать на GdkWindow.

окна событий.

Хотя, похоже, вы пытаетесь (с gdk_pixbuf_new) создать пустое пространство для рисования. В этом случае GtkImage не тот виджет, который вам нужен - используйте GtkDrawingArea. И не забудьте вызвать функцию рисования в обработчике для сигнала event-expose!

...