LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1777|回复: 1

[请教]如何用gtk/gdk编程实现图像的平移?

[复制链接]
发表于 2007-5-22 13:13:43 | 显示全部楼层 |阅读模式
我想把现有的图像(比如:一个点)从作图区的左边移到右边,怎么实现?

我用过expose_event,通过画点 --> 用矩形填充 --> 再在新的位置画点... ... ,但是这样最终貌似只有最终的效果图(要么是矩形,要么是右侧的点),没有中间的动态过程。

向大家请教~~!

下面是一个画正弦曲线的例子,请教大家如何将画曲线的过程动态的显示出来呢?

  1. #include <gtk/gtk.h>
  2. #include <math.h>
  3. static gint expose_event(GtkWidget *widget, GdkEventExpose *event)
  4. {
  5.   int i;
  6.   GdkGC *gc;
  7.   GdkColormap *colormap;
  8.   GdkColor color;

  9.   gc=gdk_gc_new(widget->window);
  10.   colormap=gtk_widget_get_colormap(widget);
  11.   gdk_color_parse("red",&color);
  12.   gdk_color_alloc(colormap,&color);
  13.   gdk_gc_set_foreground(gc,&color);
  14.   
  15.   /*画正弦曲线*/
  16.   
  17.   for(i=1;i<400;i++)
  18.   {
  19.          
  20.           gdk_draw_line(widget->window,gc,i,200+100*sin(6.28*i/400),i+1,200+100*sin(6.28*(i+1)/400));
  21.        
  22.   }
  23.   gdk_gc_unref(gc);
  24.   return FALSE;
  25. }

  26. int main(int argc,char **argv)
  27. {
  28.   GtkWidget *win_main, *draw_area;
  29.   
  30.   gtk_init(&argc,&argv);

  31.   win_main=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  32.   gtk_widget_set_usize(win_main,400,400);

  33.   draw_area = gtk_drawing_area_new();
  34.   gtk_container_add(GTK_CONTAINER(win_main), draw_area);
  35.   gtk_widget_show(draw_area);

  36.   gtk_signal_connect(GTK_OBJECT(draw_area), "expose_event",
  37.                      (GtkSignalFunc) expose_event, NULL);
  38.   gtk_signal_connect (GTK_OBJECT (win_main), "destroy",
  39.   GTK_SIGNAL_FUNC (gtk_exit), NULL);

  40.   gtk_widget_set_events(draw_area, GDK_EXPOSURE_MASK);
  41.   
  42.   gtk_widget_show(win_main);

  43.   gtk_main();
  44.   return 0;
  45. }
复制代码
发表于 2008-2-3 09:50:31 | 显示全部楼层
This is an event signal, initially emitted when the connected widget becomes fully visible on screen.
Expose events are also generated when a widget has been partially or fully covered by another widget, and is re-exposed.
expose事件只是widget被遮挡后重新出现才发生的或者第一次出现时发生。
在你的这个例子里面,你的这个draw_area在出现在屏幕上以后,才会去调用expose_event函数。
而且事件处理函数都应该是很快执行完的,因为所有的GUI都在一个线程里面,如果像你要求的显示画的过程,那就把其它事件都给阻塞了。
不过你可以采用gtk_widget_queue_draw_area()强制产生expose事件。
另外要补充的,现在的gc就在widget的style对象中,所以不需要new了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表