我想在屏幕上自動移動我的GTK_WINDOW。目前我在一個平局/移動循環中,但這非常波濤洶涌。我很新GTK編程(和一般的gui編程)。我錯過了什麼?GTK窗口動畫?
Q
GTK窗口動畫?
3
A
回答
5
你還沒有說過你希望窗口遵循什麼樣的路徑。如果路徑是一些簡單的時間函數 - 也就是說,如果您有辦法計算窗口在任何給定時間的位置 - 您可以嘗試下面代碼中所示的方法。對於示例中非常簡單的菜單,它在我的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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gtk/gtk.h>
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, µs), CycTime));
int x = (t*data->w)/HalfTime, y = (t*data->h)/HalfTime;
gtk_window_move (GTK_WINDOW(data->window),
t<HalfTime? x : 2*data->w-x, t<HalfTime? y : 2*data->h-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\n", data.w, data.h); fflush(stdout);
g_timeout_add(3, timerEvent, &data); /* Create .003 sec timer */
gtk_main();
return (0);
}
相關問題
- 1. GTK + - 刷新滾動窗口
- 2. 實時移動GTK +窗口
- 3. GTK滾動窗口 - 滾動到底部
- 4. gtk#滾動窗口 - 滾動到頂部
- 5. GTK ++窗口混淆
- 6. gtk#窗口線程
- 7. GTK窗口提示
- 8. 關閉GTK窗口
- 9. Xcode:窗口動畫
- 10. 重新打開GTK和matplotlib窗口 - GTK窗口爲空
- 11. 在GTK + 3中滾動WebKit2.Webkit窗口
- 12. 窗口移動動畫
- 13. jQuery動畫移動窗口
- 14. 使用窗口從gtk
- 15. 編程關閉gtk窗口
- 16. 節約GTK窗口位置
- 17. Python的gtk多窗口
- 18. 如何關閉Gtk#窗口
- 19. Python GTK窗口瀏覽器
- 20. Android窗口 - 查看動畫
- 21. 翻轉窗口動畫
- 22. 窗口動畫可能性?
- 23. 畫線移動窗口
- 24. 跳過Aero窗口動畫
- 25. JFrame中的窗口動畫
- 26. 幻燈片窗口動畫
- 27. ExtJS窗口動畫目標
- 28. 動畫窗口開啓(二)
- 29. SL5 - OOB - 動畫主窗口
- 30. 與jQuery的動畫窗口
沒有人願意回答我。悲傷的熊貓:'( – jdizzle 2010-06-29 09:33:47
我也不知道,我對目前爲止感興趣的是,你是否也可以發佈你的代碼?這也可能是邀請其他人回答/更正你的代碼 – Benjamin 2011-05-22 12:52:16
PS:there可能是http://macslow.thepimp.net/上的信息,請參閱http://www.youtube.com/watch?v=X8NoZ041RPA&NR=1 – Benjamin 2011-05-22 13:01:11