2011-03-03 81 views
1

我希望能夠使用Cairo或GTK函數將圖像動態地放在我的應用程序中的另一個圖像上。想象一下,例如,用戶放置魚類和海洋動物的大海:它會是這樣的。漂浮在另一個圖像上

我該怎麼做?如果你不知道,但記住任何簡單的程序或演示,那麼它也會非常受歡迎!

謝謝!

回答

2

您可以使用GtkDrawingArea並使用cairo在上面繪製圖像:

示例樂:

#include <cairo.h> 
#include <gtk/gtk.h> 

cairo_surface_t * sea_surface; 
cairo_surface_t * fish_surface; 

gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data) { 
    // Create the cairo instance. 
    cairo_t * cr = gdk_cairo_create(widget->window); 
    // Draw the sea background. 
    cairo_set_source_surface(cr, sea_surface, 0.0, 0.0); 
    cairo_paint(cr); 
    // Draw the fish. 
    cairo_set_source_surface(cr, fish_surface, 50.0, 50.0); 
    cairo_paint(cr); 
    // Destroy the cairo instance. 
    cairo_destroy(cr); 
    return FALSE; 
} 

int main(int argc, char * argv[]) { 
    gtk_init(&argc, &argv); 

    // Load images. 
    sea_surface = cairo_image_surface_create_from_png("sea.png"); 
    fish_surface = cairo_image_surface_create_from_png("fish.png"); 

    // Create window. 
    GtkWidget * window; 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    gtk_window_set_default_size(GTK_WINDOW(window), 320, 240); 

    // Create drawing area where we're going to draw our images. 
    GtkWidget * drawing_area = gtk_drawing_area_new(); 
    g_signal_connect(G_OBJECT(drawing_area), "expose-event", G_CALLBACK(on_expose_event), NULL); 
    gtk_container_add(GTK_CONTAINER(window), drawing_area); 

    // Show window and start gtk main loop. 
    gtk_widget_show_all(window); 
    gtk_main(); 

    // Clean-up. 
    cairo_surface_destroy(fish_surface); 
    cairo_surface_destroy(sea_surface); 
    return 0; 
} 

要編譯在Linux上使用:

gcc -Wall -g images.c -o images `pkg-config --cflags --libs gtk+-2.0` 

文檔:

例子:


編輯:如果您需要能夠從Java做到這一點,你可以用java-gnome提供綁定對於GTK和cairo

+0

繪製元素很容易。動態放置和移動它們是很不容易的,這是一個畫布的工作。 – liberforce 2011-03-18 16:28:36

1

我會使用clutter,詳細使用雜亂的例子,它們很不錯。

編輯:

如果您無法使用的混亂,你可以看看cairo這也對給定的網頁一些巧妙的例子

+0

不能 - 必須在GTK :( – konr 2011-03-03 12:05:16

+0

Clutter被寫入對於Gtk + http://git.clutter-project.org/cgit.cgi?url=clutter-gtk/tree/README或者只是閱讀關於gtk +嵌入的關於部分的內容http://www.clutter-project.org/about – drahnr 2011-03-03 12:15:48

+0

我的意思是「純粹的」gtk,因爲我使用GTK與Java的綁定以及Clojure的Java互操作性來在後一種語言中編寫代碼,但現在我發現還有與Clutter的Java綁定。有什麼想法,他們是多麼完整? – konr 2011-03-03 12:38:09

0

做到這一點的最佳方法是使用像goocanvas這樣的畫布,它可以與GTK一起使用並與開羅畫畫。但是,它似乎目前只有C++和python的綁定,所以如果你使用java,你將不得不尋找其他東西...