2009-11-17 4 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; 
} 

runtinme에서 사실 (라인 gdk_draw_pixbuf (....)에) 말했다 것 말이다 : 그것은 pixbuf이 잘되지 않기 때문에

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

입니까 ??? 아니면 내가 이렇게 창문으로 그릴 수 없기 때문입니까?

답변

5

GtkWidgetGdkDrawable으로 설정했기 때문에 발생했습니다. 반면에 GtkWidgetGdkDrawable을 상속합니다. 사용

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

어쨌든 정상적인 GTK 사용에서는 노출 핸들러에서 그림을 그리지 않아도됩니다. 하지 inherit from GdkDrawable, 당신은 위젯의 창에서 드로어 블을 얻을 필요가

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

위젯 수행합니다 이미지를 표시하려면, 단지 GtkImage 위젯을 사용합니다.

0

감사합니다.

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()을보십시오 :하지만 내 목적은, 그것이 작동하지 않는 내가 얻을 더 이상 주장 '해달라고해도, 어쨌든 ... 윈도우 BG에 그리기하려고했다? – ptomato

관련 문제