我希望能够使用Cairo或GTK函数将图像动态地放在我的应用程序中的另一个图像上。想象一下,例如,用户放置鱼类和海洋动物的大海:它会是这样的。漂浮在另一个图像上
我该怎么做?如果你不知道,但记住任何简单的程序或演示,那么它也会非常受欢迎!
谢谢!
我希望能够使用Cairo或GTK函数将图像动态地放在我的应用程序中的另一个图像上。想象一下,例如,用户放置鱼类和海洋动物的大海:它会是这样的。漂浮在另一个图像上
我该怎么做?如果你不知道,但记住任何简单的程序或演示,那么它也会非常受欢迎!
谢谢!
您可以使用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。
不能 - 必须在GTK :( – konr 2011-03-03 12:05:16
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
我的意思是“纯粹的”gtk,因为我使用GTK与Java的绑定以及Clojure的Java互操作性来在后一种语言中编写代码,但现在我发现还有与Clutter的Java绑定。有什么想法,他们是多么完整? – konr 2011-03-03 12:38:09
做到这一点的最佳方法是使用像goocanvas这样的画布,它可以与GTK一起使用并与开罗画画。但是,它似乎目前只有C++和python的绑定,所以如果你使用java,你将不得不寻找其他东西...
绘制元素很容易。动态放置和移动它们是很不容易的,这是一个画布的工作。 – liberforce 2011-03-18 16:28:36