- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个用 C
编写的 GTK+
应用程序,它加载一个动画 GIF
文件矩阵。这些 GtkImages
在加载时自动运行动画,然后在动画完成时停止。我将如何重新启动包含 GIF
的每个 GtkImage
的动画以及动画完成时是否生成信号?
谢谢。
编辑:gdk_pixbuf_animation_get_iter()
的使用是否描述了here让这成为可能?
下面提供了完整的代码。
/*
* 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 *SetupWindow(gchar *data, const gchar *filename);
static void destroy (GtkWidget *window, gpointer data);
void btnSpin_clicked(GtkWidget *button, gpointer data);
void btnExit_clicked(GtkWidget *button, gpointer data);
/********************/
GtkWidget *images[3][5];
static void destroy (GtkWidget *window, gpointer data)
{
gtk_main_quit ();
}
void btnSpin_clicked(GtkWidget *button, gpointer data)
{
printf("Spin Button pressed.\n");
return;
}
void btnExit_clicked(GtkWidget *button, gpointer data)
{
gtk_main_quit();
return;
}
GtkWidget *SetupWindow(gchar *data, const gchar *filename)
{
GdkPixmap *background;
GdkPixbuf *pixbuf;
GdkScreen *ourscreen;
GdkColormap *colormap;
GtkStyle *style;
GdkColor fg;
GdkColor bg;
GError *error = NULL;
GdkRectangle *rect;
GtkWidget *window;
pixbuf = gdk_pixbuf_new_from_file (filename,&error);
if (error != NULL) {
if (error->domain == GDK_PIXBUF_ERROR) {
g_print ("Pixbuf Related Error:\n");
}
if (error->domain == G_FILE_ERROR) {
g_print ("File Error: Check file permissions and state:\n");
}
g_printerr ("%s\n", error[0].message);
}
gdk_pixbuf_render_pixmap_and_mask (pixbuf, &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), data);
// gtk_window_maximize(GTK_WINDOW(window));
gtk_window_set_modal (GTK_WINDOW (window),TRUE);
gtk_window_set_default_size(GTK_WINDOW(window),628,530);
gtk_widget_set_style (GTK_WIDGET(window), GTK_STYLE(style));
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);
gtk_container_set_border_width(GTK_CONTAINER(window), 0);
//gtk_window_set_resizable(GTK_WINDOW(window), (gboolean) FALSE);
gtk_window_set_decorated( GTK_WINDOW(window), FALSE );
return(window);
}
int main (int argc, char *argv[])
{
GdkPixbufAnimation *animation;
GtkWidget *image;
int x,y;
GdkPixbuf *pixBuf;
GdkPixmap *pixMap;
gchar filename[20];
GtkWidget *btnSpin, *btnExit;
GtkWidget *frame; /* for absolute positionining of widgets */
GtkWidget *window;
int posx, posy;
gtk_init (&argc, &argv);
window = SetupWindow("Demo", "background.gif");
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
frame = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), frame);
btnSpin = gtk_button_new_with_label("Spin");
gtk_widget_set_size_request(btnSpin, 80, 35);
gtk_fixed_put(GTK_FIXED(frame), btnSpin, 229, 485);
g_signal_connect(G_OBJECT( btnSpin ), "clicked", G_CALLBACK(btnSpin_clicked), NULL );
btnExit = gtk_button_new_with_label("Exit");
gtk_widget_set_size_request(btnExit, 80, 35);
gtk_fixed_put(GTK_FIXED(frame), btnExit, 320, 485);
g_signal_connect(G_OBJECT( btnExit ), "clicked", G_CALLBACK(btnExit_clicked), NULL );
/* setup animated gifs */
for( y = 0; y < 3; y++ )
{
posy = (y*120) + 20;
for( x = 0; x < 5; x++ )
{
posx = (x*120) + 20;
/* set each Image widget to spin GIF */
sprintf( filename,"%d-%d.gif", y+1,x+1 );
images[y][x] = gtk_image_new_from_file(filename);
gtk_fixed_put(GTK_FIXED(frame), images[y][x], posx, posy);
}
}
gtk_widget_show_all(window);
gtk_main ();
return 0;
}
最佳答案
查看 GtkImage source code 后,恐怕没有动画完成时产生的信号。但是,您应该能够通过调用 gtk_image_set_from_file()
来重新启动动画。或 gtk_image_set_from_animation()
.
为了完全解决您最初的问题,我建议您创建一个 GtkImage 的子类。它的行为应该与 GtkImage 完全一样,除了 animation_timeout
。如果 delay < 0
应该发送一个信号周围line 1315 .
关于创建 GObject 子类的信息(注意 GtkImage 是一个 GObject)可以在 here 中找到。 .
关于c - 如何在 GTK+ 中启动和停止 GIF 动画 GtkImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840069/
我希望能够从开罗表面制作 GtkImage(无需编写临时文件)。 我目前将表面以 PNG 形式写入字符数组,然后将其提供给 PixbufLoader 以获取用于创建 GtkImage 的 Pixbuf
例如,如何在 GtkImage 上施加 GdkDrawingArea 以便在图像上绘画? 最佳答案 GtkDrawingArea 和 GtkImage 是不同的类,因此您必须选择其中之一。您仍然可以通
我正在从网页下载图片,图片太大(通常最大边缘为 600 像素),我想将其缩小以适合 220x220 像素的框。 我的代码可以正常工作——除了最终尺寸。下载图像,然后放入 GtkImage(它来自 Gl
在我的程序中,我想通过单击按钮来更改图像,但我找不到该功能 class TestGdkPixbuf(Gtk.Window): Cover= "image.png" Cover2= "i
我正在做一个学校项目,我已经用 SDL 做了很大一部分图像处理,现在我正在用 Glade 构建一个 GUI,我需要将我的 SDL_Surface 转换为 GtkImage 以显示我处理的每一步图形用户
我正在尝试显示来自网络摄像头的视频。我使用 opencv 从网络摄像头捕获图像,然后尝试在 GtkImage 上显示它们。 这是我的代码,它在一个单独的线程中运行。 gpointer View::
我有一个用 C 编写的 GTK+ 应用程序,它加载一个动画 GIF 文件矩阵。这些 GtkImages 在加载时自动运行动画,然后在动画完成时停止。我将如何重新启动包含 GIF 的每个 GtkImag
我在 GtkEventBox 中有一个 GtkImage,在 glade 上定义 img/patient_icons/icon_patient.pn
我是一名优秀的程序员,十分优秀!