【发布时间】:2012-06-14 17:08:52
【问题描述】:
我有一个简单的应用程序,它应该使用 GTK+ 和 Cairo 每 x 毫秒将装饰轮旋转这么多度。我在下面有一些代码可以从计时器调用cairo_rotate()。但是,图像不会改变。我是否必须使图像无效才能触发暴露事件?我对 Cairo 很陌生,我非常感谢一个简单的示例演示如何在 GTK+ 中使用 Cairo 旋转图像。
#include <cairo.h>
#include <gtk/gtk.h>
cairo_surface_t *image;
cairo_t *cr;
gboolean rotate_cb( void )
{
cairo_rotate (cr, 1);
//cairo_paint(cr);
printf("rotating\n");
return( TRUE );
}
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cr = gdk_cairo_create (widget->window);
cairo_set_source_surface(cr, image, 0, 0);
cairo_paint(cr);
printf("Paint\n");
//cairo_destroy(cr);
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
image = cairo_image_surface_create_from_png("wheel.png");
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "expose-event",
G_CALLBACK (on_expose_event), NULL);
g_signal_connect(window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 500);
gtk_widget_set_app_paintable(window, TRUE);
gtk_widget_show_all(window);
g_timeout_add(500, (GSourceFunc) rotate_cb, NULL);
gtk_main();
cairo_destroy(cr);
cairo_surface_destroy(image);
return 0;
}
【问题讨论】:
-
要意识到的重要一点是 Cairo 不会创建持久对象,因此在您绘制完之后旋转它不会做任何事情。这是 Cairo 和像 GooCanvas 这样的画布库的区别。