2009-11-17 81 views
2

我已經做了GTK中這個簡單的應用程序,只是爲了測試的事情了......我來自擺動,從而重新定義繪製事件的功能是正常的,我......總之,似乎不工作:GTK初學者應用程序不會有斷言失敗的工作

#include <gtk-2.0/gtk/gtk.h> 
#include <gtk-2.0/gdk-pixbuf/gdk-pixbuf.h> 
#include <stdlib.h> 
#include<string.h> 
#include<stdio.h> 
#include <iostream> 

GdkPixbuf *imm; 

void destroy(GtkWidget *widget, gpointer data) { 
    gtk_main_quit(); 
} 

gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, 
     gpointer data) { 
    gdk_draw_pixbuf((GdkDrawable*) widget, widget->style->white_gc, imm, 0, 0, 
      0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 
    return FALSE; 
} 

int main(int argc, char** argv) { 

    char* filename = new char[1000]; 
    GError *error = NULL; 
    GtkWidget *window; 

    gtk_set_locale(); 
    gtk_init(&argc, &argv); 

    if (argv[1] == NULL) { 
     std::cout << "Err."; 
     return -1; 
    } 

    strcpy(filename, argv[1]); 

    imm = gdk_pixbuf_new_from_file(filename, &error); 

    if (!imm) { 
     std::cout << "err closing"; 
     return 0; 
    } 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request((GtkWidget*) window, 500, 350); 
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL); 
    g_signal_connect(window, "expose-event", 
      G_CALLBACK(on_expose_event), NULL); 

    gtk_container_set_border_width(GTK_CONTAINER (window), 10); 
    gtk_widget_show(window); 
    gtk_main(); 

    return 0; 
} 

..in其實在runtinme說(上線gdk_draw_pixbuf(....)):

(cConvolve:5011): Gdk-CRITICAL **: gdk_draw_pixbuf: assertion `GDK_IS_DRAWABLE (drawable)' failed 

是不是因爲這個pixbuf不好???還是因爲我不能像這樣畫到窗戶上?

回答

5

這是因爲您投GtkWidgetGdkDrawable,而GtkWidget不會從GdkDrawable繼承。使用

gdk_draw_pixbuf(GDK_DRAWABLE(gtk_widget_get_window(widget)), blah blah...); 

無論如何,在正常的GTK使用中,您不必在處理程序中執行任何繪圖。要顯示圖像,只需使用GtkImage部件:

GtkImage *image = gtk_image_new_from_file(filename); 
gtk_container_add(GTK_CONTAINER(window), image); 
1

窗口小部件不inherit from GdkDrawable,你需要從控件的窗口中繪製。

0

謝謝。但我的目的是試圖在窗口BG繪製...反正就算我不」得到了斷言,這是行不通的:

gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, 
     gpointer data) { 
    int w, h; 
    w = gdk_pixbuf_get_width(imm); 
    h = gdk_pixbuf_get_height(imm); 

    gdk_draw_pixbuf((GdkDrawable*) widget->window, widget->style->fg_gc[ GTK_STATE_NORMAL ], imm, 0, 0, 
      0, 0, w, h, GDK_RGB_DITHER_NORMAL, 0, 0); 


    return FALSE; 
} 
+0

嘗試'gtk_widget_set_app_paintable()'? – ptomato 2009-11-17 18:19:54