Как создать GtkImage из контекста 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;
}

Я не понимаю, почему это не удается. Любая помощь приветствуется!


person Zurbo82    schedule 23.12.2010    source источник


Ответы (1)


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

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

person ptomato    schedule 23.12.2010
comment
Спасибо! Я только что убедился на горьком опыте, что недостаточно просто поискать в Google существующий код, чтобы заставить приложения Gtk работать. Сначала постараюсь получить некоторые базовые знания, используя официальное руководство по программированию. - person Zurbo82; 24.12.2010
comment
Этот мануал действительно старый. Как видно на главной странице developer.gnome.org, они работают над новым сайтом для разработчиков. В этом репозитории должны быть новые примеры программирования, написанные компетентными людьми: git.gnome.org/browse/gnome-devel-docs/tree/demos/C Они будут размещены на новом сайте, но я еще не просматривал их, поэтому не могу сказать, как далеко они продвинулись. - person ptomato; 24.12.2010