在绘图区域上绘制图像

时间:2012-04-20 17:25:27

标签: c gtk drawing

我试图在绘图区域上绘制图像而没有运气。我看到了几个python示例,但我无法将它们实现为c,我正在使用它(例如draw an image to gtk.DrawingArea?

我已经创建了一个Pixbuf变量来存储我想要在绘图区域绘制的图像,但是没有像gtk_drawing_area_draw_pixbuf这样的函数或与此相关的东西。感谢任何建议。

2 个答案:

答案 0 :(得分:8)

您需要使用expose-event回调(假设您正在使用Gtk + 2.0)将pixbuf绘制到绘图区域。没有gtk_drawing_area_draw_pixbuf而是gdk_draw_pixbuf。从版本2.22开始,这已被弃用,有利于gdk_cairo_set_source_pixbuf。您可以在这些行中的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_signal_connect(例如g_signal_connect (da, "expose-event", G_CALLBACK (da_expose), NULL);)连接到回调。如果您使用的是Gtk + 3.0,那么您将使用draw代替expose-event。您始终可以参考gtk-demo / gtk3-demo应用程序,这些应用程序可以查看示例以及代码。这应该在您的发行版的软件包存储库中可用,或者您始终可以从源代码获取它 希望这有帮助!
PS:This link可能会为您提供一些指示

答案 1 :(得分:6)

现在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;
}