C 在绘图区域上绘制图像

C 在绘图区域上绘制图像,c,gtk,drawing,C,Gtk,Drawing,我试图在绘图区域上绘制图像,但运气不佳。我看到了一些python示例,但无法将它们实现到我正在使用的c中(例如) 我已经创建了一个Pixbuf变量来存储我想要在绘图区域上绘制的图像,但是没有gtk_drawing_area_draw_Pixbuf之类的函数或与之相关的函数。任何建议都非常感谢。您需要使用回调(假设您正在使用gtk+2.0)将Pixbuf绘制到绘图区域上。没有gtk\u绘图\u绘图区域\u绘图\u pixbuf而您有。从版本2.22开始,这一点已被弃用,取而代之的是版本2.22。您

我试图在绘图区域上绘制图像,但运气不佳。我看到了一些python示例,但无法将它们实现到我正在使用的c中(例如)

我已经创建了一个Pixbuf变量来存储我想要在绘图区域上绘制的图像,但是没有gtk_drawing_area_draw_Pixbuf之类的函数或与之相关的函数。任何建议都非常感谢。

您需要使用回调(假设您正在使用gtk+2.0)将Pixbuf绘制到绘图区域上。没有
gtk\u绘图\u绘图区域\u绘图\u pixbuf
而您有。从版本2.22开始,这一点已被弃用,取而代之的是版本2.22。您可以在expose事件回调中调用这些函数(请仅作为参考):
如果您的Gtk版本<2.22

static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
    (void)event; (void)data;
    GdkPixbuf *pix;
    GError *err = NULL;
    /* Create pixbuf */
    pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
    if(err)
    {
        printf("Error : %s\n", err->message);
        g_error_free(err);
        return FALSE;
    }
    GdkDrawable *draw = gtk_widget_get_window(da);
    /* Draw pixbuf */
    gdk_draw_pixbuf(draw, NULL, pix, 0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
    return FALSE;
}
从2.22版开始,您必须在这些行中使用
cairo
某些内容:

static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
    (void)event; (void)data;
    GdkPixbuf *pix;
    GError *err = NULL;
    /* Create pixbuf */
    pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
    if(err)
    {
        printf("Error : %s\n", err->message);
        g_error_free(err);
        return FALSE;
    }
    cairo_t *cr;
    cr = gdk_cairo_create (da->window);
    gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
    cairo_paint(cr);
    cairo_fill (cr);
    cairo_destroy (cr);
    return FALSE;
}
当然,您应该使用
g_信号连接
(比如
g_信号连接(da,“expose event”,g_回调(da_expose),NULL);
)。如果您使用的是Gtk+3.0,那么您将使用而不是
expose event
。您可以随时参考
gtk demo
/
gtk3 demo
应用程序,该应用程序可与代码一起查看示例。这应该在发行版的软件包存储库中提供,或者您可以随时从源代码处获取。
希望这有帮助

PS:现在GTK版本是GTK+3.0,可能会为您提供一些提示。 如果您使用的是GTK+3.0,请按如下方式使用

// gcc expose.c -o expose `pkg-config gtk+-3.0 --cflags --libs`
#include <gtk/gtk.h>
#include <stdlib.h>

static gboolean
on_window_draw (GtkWidget *da, GdkEvent *event, gpointer data)
{
    (void)event; (void)data;
    GdkPixbuf *pix;
    GError *err = NULL;
    /* Create pixbuf */
    pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
    if(err)
    {
        printf("Error : %s\n", err->message);
        g_error_free(err);
        return FALSE;
    }
    cairo_t *cr;
    cr = gdk_cairo_create (gtk_widget_get_window(da));
    //    cr = gdk_cairo_create (da->window);
    gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
    cairo_paint(cr);
    //    cairo_fill (cr);
    cairo_destroy (cr);
    //    return FALSE;
}

int main ( int argc, char **argv) {
    GtkWidget *window;
    GtkWidget *canvas;
    gtk_init (&argc , &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (window,
        50, 50);

    g_signal_connect (window, "destroy",
        G_CALLBACK (gtk_main_quit) , NULL);
    canvas = gtk_drawing_area_new ();
    gtk_container_add (GTK_CONTAINER (window), canvas);
    g_signal_connect (canvas, "draw", (GCallback) on_window_draw, NULL);

    gtk_widget_set_app_paintable(canvas, TRUE);
    gtk_widget_show_all (window);
    gtk_main ();
    return 0;
}
//gcc expose.c-o expose`pkg config gtk+-3.0--cflags--libs`
#包括
#包括
静态gboolean
在窗口上绘制(GtkWidget*da、GdkEvent*事件、gpointer数据)
{
(作废)事件;(作废)数据;
GdkPixbuf*pix;
GError*err=NULL;
/*创建pixbuf*/
pix=gdk_pixbuf_new_from_文件(“/usr/share/icons/cab_view.png”,&err);
如果(错误)
{
printf(“错误:%s\n”,错误->消息);
g_无错误(err);
返回FALSE;
}
开罗*cr;
cr=gdk_cairo_create(gtk_widget_get_window(da));
//cr=gdk\u cairo\u create(da->window);
gdk_cairo_set_source_pixbuf(cr,pix,0,0);
开罗漆(cr);
//开罗填料(cr);
开罗大学(cr);
//返回FALSE;
}
int main(int argc,字符**argv){
GtkWidget*窗口;
GtkWidget*帆布;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_小部件_设置_大小_请求(窗口,
50, 50);
g_信号_连接(窗口,“销毁”,
G_回调(gtk_main_quit),NULL);
画布=gtk_绘图_区域_新建();
gtk_容器添加(gtk_容器(窗口),画布);
g_信号_连接(画布,“绘制”,窗口上的(GCallback)绘制,空);
gtk_widget_set_app_paintable(画布,真实);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

猜得好,我用的是2.24,还有更大的答案!如果可能的话,我会给你100票!我用的是“曝光事件”信号,但我猜不需要开罗。干杯again@mini-我:很抱歉,我不再像以前那样积极地跟随Gtk了。你想做什么?你检查gtk demo了吗?@other.anon.coward我通过更正返回值修复了你的示例。如果我理解GTK,return必须是
true
,以禁止在处理程序之后调用其他处理程序
So返回FALSE
将是错误的,图像将被背景或其他内容替换。好吧,这将是一个完整的循环。你的例子教会了我如何在Python中工作!我缺少了
cairo\u-paint(cr)
位,我正在查看的Python中的几个答案中也排除了它。非常感谢!