在绘图区域上绘制图像

问题描述:

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

我已经创建了一个Pixbuf变量来存储我想在绘图区绘制的图像,但没有像gtk_drawing_area_draw_pixbuf或其他相关的功能。任何建议表示赞赏。

您需要利用expose-event回调(假设您正在使用Gtk + 2.0)将pixbuf绘制到绘图区域。没有gtk_drawing_area_draw_pixbuf,而是您有gdk_draw_pixbuf。从版本2.22开始已弃用gdk_cairo_set_source_pixbuf。你可以叫你揭露事件回调在这些线路上的东西,这些功能(请使用它们作为参考):
如果您的基于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可能会为您提供一些指针

+0

大猜想,使用2.24,甚至更大的答案,以及IM!我会给你100票了,如果可以的!我用的是“揭发事件”信号,但猜测开罗不会是needed.Cheers再次 – Rrjrjtlokrthjji 2012-04-20 19:11:58

+0

这两个示例都不起作用。 – Bitterblue 2013-11-18 08:44:59

+0

@迷你我:我很抱歉,但我没有像以前那样积极跟踪Gtk。你试图做什么?你检查过gtk-demo吗? – 2013-11-20 17:04:15

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