2012-04-20 11 views
2

私は幸運のない描画領域に画像を描画しようとしています。私はいくつかのPythonの例を見ましたが、私はそれらを私が使用しているCに実装できませんでした(例えばdraw an image to gtk.DrawingArea?描画領域に画像を描画

描画領域に描画したい画像を格納するためのPixbuf変数を既に作成していますが、gtk_drawing_area_draw_pixbufなどの関数はありません。何か提案がありがとうございます。

答えて

6

描画エリアにpixbufを描画するには、expose-eventコールバック(Gtk + 2.0を使用していると仮定します)を使用する必要があります。代わりにgtk_drawing_area_draw_pixbufはありません。gdk_draw_pixbufです。バージョン2.22以降はgdk_cairo_set_source_pixbufが推奨されていません。あなたはcairoの使用を加える必要がありますあなたの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:あなたは、これらのライン上のイベントコールバックの何かを(目安としてそれらを使用してください)公開でこれらの関数を呼び出すことができますこれらの行に何か:もちろん

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を使用している場合はexpose-eventの代わりにdrawを使用します。 gtk-demo/gtk3-demoアプリケーションを参照して、コードとともにサンプルを見ることができます。これはあなたのディストリビューションのパッケージリポジトリで利用できるようにするか、いつでもソースから入手できます。
これが役立つことを願っています!
PS:This linkは、いくつかのポインタを提供するかもしれません。

+0

私はあなたに可能な限り100票を与えます!私は「公開イベント」信号を使用していましたが、カイロは必要ではないと推測しました。もう一度 – Rrjrjtlokrthjji

+0

両方の例は機能しません。 – Bitterblue

+0

@ mini-me:申し訳ありませんが、私はかつてこれまで慣れていたようにGtkに積極的に従っていません。あなたは何をしようとしていますか? gtk-demoをチェックしましたか? –

3

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; 
} 
関連する問題