linux gtk的界面,linux-GTK窗口动画吗?

您尚未说出希望窗口遵循哪种路径.如果路径是时间的简单函数,也就是说,如果您有一种方法可以计算窗口在任何给定时间的位置,则可以尝试以下代码中所示的方法.对于示例中非常简单的菜单,它可以在我的Linux系统上正常工作,并且产生相当平滑的运动.

该方法的关键在于,它不会为每个计时器事件将窗口移动给定距离,而是会找到当前时间,并将窗口移动到当时应位于的位置.因此,运动速度的时间导数应为常数,即使定时器事件不定期发生,也可以避免运动参差不齐. (如g-timeout-add() description中所述,不规则行为很容易发生.)

在此示例中,路径重复地从窗口的左上方到左下方再返回. timerEvent()中的常量“ HalfTime”控制着从一个角到另一个角移动的时间. g_timeout_add()调用中的常数3将计时器间隔设置为0.003秒,或每秒大约333移动(MPS). (您可能想尝试更合理的速率,例如20、30、40等MPS;我使用了数字3,因为在使用它之前我没有查询g-timeout-add(),并且假设延迟大约是几百秒) 33 MPS,而不是毫秒,大约是333 MPS.)如果窗口内容非常复杂,那么实际使用的MPS会更少.另外,我尝试了一些较慢的汇率,并给人更多关于断断续续的印象.

/* $Id: app12.c $

Re: animating position of a top-level Gtk window

jiw July 2011 -- Offered without warranty under GPL v3

terms per http://www.gnu.org/licenses/gpl.html */

#include

#include

#include

#include

#include

typedef struct DATA { GTimer *timer; GtkWidget *window; int w, h; }

DataStruct;

gboolean timerEvent(void *dataset) {

enum { HalfTime=8, CycTime=2*HalfTime };

gulong micros;

DataStruct *data =dataset;

double t = fabs(fmod (g_timer_elapsed (data->timer, &micros), CycTime));

int x = (t*data->w)/HalfTime, y = (t*data->h)/HalfTime;

gtk_window_move (GTK_WINDOW(data->window),

tw-x, th-y);

return TRUE; /* Keep timeout running */

}

int main(int argc, char **argv) {

GtkWidget *vbox, *b;

GdkScreen *gds;

DataStruct data;

data.timer = g_timer_new();

gtk_init (&argc, &argv);

data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_window_set_default_size (GTK_WINDOW(data.window), 200, 150);

g_signal_connect (G_OBJECT(data.window), "destroy",

G_CALLBACK(gtk_main_quit), NULL);

vbox = gtk_vbox_new (FALSE, 0);

gtk_container_add (GTK_CONTAINER(data.window), vbox);

b = gtk_button_new_with_label ("Click to Exit");

gtk_box_pack_start (GTK_BOX(vbox), b, TRUE, TRUE, TRUE);

g_signal_connect (b, "clicked", G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all (data.window);

gds = gdk_screen_get_default (); /* Get pointer to screen */

data.w = gdk_screen_get_width (gds); /* Find out screen width */

data.h = gdk_screen_get_height (gds); /* Find out screen height */

printf ("Screen size = %d by %d

", data.w, data.h); fflush(stdout);

g_timeout_add(3, timerEvent, &data); /* Create .003 sec timer */

gtk_main();

return (0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值