4

運が悪かったので、描画領域に画像を描画しようとしています.Pythonの例をいくつか見ましたが、使用しているcにそれらを実装できませんでした(たとえば、gtk.DrawingAreaに画像を描画しますか?

描画領域に描画したい画像を格納するためのPixbuf変数を作成しましたが、gtk_drawing_area_draw_pixbufなどの関数はありません。

4

2 に答える 2

10

expose-eventpixbufを描画領域に描画するには、コールバックを利用する必要があります(Gtk + 2.0を使用していると仮定します)。gtk_drawing_area_draw_pixbuf代わりにあなたが持っているものはありませんgdk_draw_pixbufgdk_cairo_set_source_pixbufこれは、バージョン2.22以降で非推奨になりました。エクスポーズイベントコールバックでこれらの関数をこれらの行で呼び出すことができます(参照としてのみ使用してください):
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(say g_signal_connect (da, "expose-event", G_CALLBACK (da_expose), NULL);)を使用してコールバックに接続しているはずです。Gtk + 3.0を使用している場合は、のdraw代わりにを使用しますexpose-event。コードと一緒にサンプルを見ることができるgtk-demo/アプリケーションをいつでも参照できます。gtk3-demoこれは、ディストリビューションのパッケージリポジトリで利用できる必要があります。そうでない場合は、いつでもソースから取得できます。
お役に立てれば!
PS:このリンクはあなたにいくつかの指針を提供するかもしれません

于 2012-04-20T19:07:59.053 に答える
8

現在、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;
}
于 2015-09-24T11:03:44.247 に答える