如何从 Cairo 上下文创建 GtkImage?

发布于 2024-10-09 07:42:16 字数 812 浏览 3 评论 0原文

我得到了一个使用 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(可绘制)”失败

与简单相同:

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

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

I got a paint function that works using a Cairo context and the end result should be a GtkImage (without intermediate image creation). I tried to use the gdk_cairo_create function but this code:

...
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);
...

fails with:

Gdk-CRITICAL **: IA__gdk_cairo_create: assertion `GDK_IS_DRAWABLE (drawable)' failed

Same with a simple:

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

I don't understand why this fails. Any help is appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自此以后,行同陌路 2024-10-16 07:42:16

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

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

GtkImage doesn't have a GdkWindow, so the call to gtk_widget_get_window() or the access of widget->window returns NULL. You can put the GtkImage in a GtkEventBox and draw on the event box's GdkWindow.

Although, it looks like you're trying (with gdk_pixbuf_new) to create an empty space to draw on. In that case, GtkImage is not the widget you want -- use GtkDrawingArea. And don't forget to call your paint function in the handler for the event-expose signal!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文