2012-05-30 4 views
3

У меня есть простое приложение Linux CGTK, которому необходимо установить фон основного окна на изображение из файла GIF. Я сделал некоторое чтение, и кажется, что я должен быть в состоянии сделать следующее:
Как установить фон GtkWindow на изображение?

1- материал фонового изображения в GdkPixbuf с использованием gdk_pixbuf_new_from_file()
2- использования gdk_pixbuf_render_pixmap_and_mask() для визуализации GdkPixbuf в GdkPixMap
3- установить фон на GtkWindow с помощью gdk_window_set_back_pixmap()

появляется вызов gdk_window_set_back_pixmap() требовать GdKWindow instea d от GtkWindow. Мой код, который не работает, ниже, за которым следуют мои конкретные вопросы.

/* 
* Compile me with: 
* gcc -o reels reels.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) 
*/ 

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <time.h> 

/* GTK */ 
#include <gdk/gdkx.h> 
#include <gtk/gtk.h> 

/**** prototypes ****/ 
static void destroy (GtkWidget*, gpointer); 
GdkPixbuf *create_pixbuf(const gchar * filename); 
/********************/ 

GtkWidget *images[3][5]; 

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


GdkPixbuf *create_pixbuf(const gchar * filename) 
{ 
    GdkPixbuf *pixbuf; 
    GError *error = NULL; 
    pixbuf = gdk_pixbuf_new_from_file(filename, &error); 
    if(!pixbuf) { 
     fprintf(stderr, "%s\n", error->message); 
     g_error_free(error); 
    } 

    return pixbuf; 
} 


int main (int argc, char *argv[]) 
{ 
    GtkWidget *window, *table; 
    GdkPixbufAnimation *animation; 
    GtkWidget *image; 
    int x,y;  
    GdkPixbuf *pixBuf; 
    GdkPixmap *pixMap; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_default_size (GTK_WINDOW (window), 628, 530); 
    gtk_window_set_title (GTK_WINDOW (window), "Demo"); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    //gtk_window_set_decorated(GTK_WINDOW(window), FALSE); 

    pixBuf = create_pixbuf("background.gif"); 
    gdk_pixbuf_render_pixmap_and_mask(pixBuf, &pixMap, NULL, 255); 
    gdk_window_set_back_pixmap(GDK_WINDOW (window), pixMap, (gboolean) TRUE); 



#if 0 
    /* some code I found that is supposed to create a background image.. 
     Can't seem to get it converted correctly into 'C' 
    */  

area=gtk.Drawingarea() 

pixbuf=gtk.gdk.pixbuf_new_from_file('background.png') 
pixmap, mask=pixbuf.render_pixmap_and_mask() 

area.window.set_back_pixmap(pixmap, False) 
#endif  

    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); 
    table = gtk_table_new (3, 5, TRUE); 

    /* setup animated gifs */ 
    for(y = 0; y < 3; y++) 
    { 
     for(x = 0; x < 5; x++) 
     { 
      /* set each Image widget to spin GIF */ 
      images[y][x] = gtk_image_new_from_file("spinning.gif");; 
      gtk_table_attach (GTK_TABLE (table), images[y][x], x, x+1, y, y+1, GTK_EXPAND, GTK_SHRINK, 0, 0);    
     } 
    } 

    /* Add five pixels of spacing between every row and every column. */ 
    gtk_table_set_row_spacings (GTK_TABLE (table), 5); 
    gtk_table_set_col_spacings (GTK_TABLE (table), 5); 

    gtk_container_add (GTK_CONTAINER (window), table); 
    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
} 

код компилируется и работает, но я получаю следующие ошибки во время выполнения (что я ожидал, так как я не знаю, как для получения оценки GdkWindow из GtkWindow:

(барабаны: 10951): GLib-GObject-WARNING **: недопустимый литой из GtkWindow' to GdkWindow '

(барабаны: 10951): Gdk-CRITICAL **: gdk_window_set_back_pix карта: утверждение `GDK_IS_WINDOW (окно)» не удалось

Мои вопросы:

1- Как вывести GdkWindow из главного окна кодов (GtkWindow)?
2. Нужно ли вообще использовать область рисования?
3- Что мне нужно сделать, чтобы получить изображение background.gif, отображаемое в качестве фона в главном окне?

Любая помощь была бы принята с благодарностью. Я видел много фрагментов кода, но мне сложно скомпоновать все это, и я довольно новичок в .

+2

http://stackoverflow.com/questions/5819493/gtk-changing-background-image-of-window – 0xAX

+0

Спасибо 'shk'. Я посмотрю. – Chimera

+0

Это сделало трюк. Спасибо, шк. – Chimera

ответ

5

Мои вопросы:

1- Как вывести GdkWindow из кодов главного окна (GtkWindow)?
2. Нужно ли вообще использовать область рисования?
3- Что мне нужно сделать, чтобы изображение background.gif отображалось в качестве фона в главном окне?

Если вы хотите установить изображение как фон в вас GTK окно, вы должны сделать:
1 - Загрузить изображение в GdkPixbuf или вариант. (gdk_pixbuf_new_from_file)
2 - Создайте растровое изображение pixmap и mask. (gdk_pixbuf_render_pixmap_and_mask())
3 - Создайте GtkStyle, который хранит информацию о стиле для виджетов.
4 - Загрузите рендеринг pixmap в стиль.
5 - Установите GtkStyle в главное окно.

Пример:

#include <gtk/gtk.h> 
#include <stdio.h> 
#include <stdlib.h> 

GdkPixbuf *load_pixbuf_from_file (const char *filename) 
{ 
    GError *error = NULL; 
    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (filename, &error); 

    if (pixbuf == NULL) 
    { 
     g_print ("Error loading file: %d : %s\n", error->code, error->message); 
     g_error_free (error); 
     exit (1); 
    } 
    return pixbuf; 
} 

GdkPixbufAnimation *load_pixbuf_animation_from_file (const char *filename) 
{ 
    GError *error = NULL; 
    GdkPixbufAnimation *pixbuf = gdk_pixbuf_animation_new_from_file (filename, &error); 

    if (pixbuf == NULL) 
    { 
     g_print ("Error loading file: %d : %s\n", error->code, error->message); 
     g_error_free (error); 
     exit (1); 
    } 
    return pixbuf; 
} 

int main (int argc, char **argv) 
{ 
    GtkWidget *window = NULL; 
    GdkPixbuf *image = NULL; 
    GdkPixbufAnimation * anim = NULL; 
    GtkWidget *widget = NULL; 
    GdkPixmap *background = NULL; 
    GtkStyle *style = NULL; 

    gtk_init (&argc, &argv); 
    /* Load a non animated gif */ 
    image = load_pixbuf_from_file ("/home/midnigther/Desktop/pict.gif"); 
    // widget = gtk_image_new_from_pixbuf (image); 
    gdk_pixbuf_render_pixmap_and_mask (image, &background, NULL, 0); 
    style = gtk_style_new(); 
    style->bg_pixmap [0] = background; 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW(window), "Load Image"); 
    gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); 
    gtk_widget_set_style (GTK_WIDGET(window), GTK_STYLE (style)); 
    gtk_window_set_transient_for (GTK_WINDOW (window), NULL); 

    GtkWidget *hbox = NULL; 
    hbox = gtk_hbox_new (0, FALSE); 
    gtk_container_add (GTK_CONTAINER(window), hbox); 

    GtkWidget *button = NULL; 
    button = gtk_button_new_with_label ("Sonic"); 
    gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); 

    gtk_widget_show_all (window); 
    gtk_main(); 
    return 0; 
} 
+0

Очень полезно спасибо s0d. – Chimera

1

В качестве частичного ответа, вы можете извлечь GdkWindow из GtkWindow, используя (ожидаемый) API, gtk_widget_get_window().

+0

Благодарим вас за информацию. – Chimera

Смежные вопросы