免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5469 | 回复: 3
打印 上一主题 下一主题

GTK 如何用鼠标拖动event窗口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-24 17:21 |只看该作者 |倒序浏览
建立了一个Even窗口,用来接收事件信息。但是为什么不能用鼠标进行拖动和改变大小?

是不是还有什么事件需要添加上?

另外,想知道如何完成刚才提出的用鼠标拖拽与改变大小的动作。
谢谢!

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2011-03-24 21:03 |只看该作者
回复 1# fengtom_lcdtv


    看你的另一篇帖子,你要的就是下面的功能吧:
  1. #include <gtk/gtk.h>

  2. gboolean progress_button_release (GtkWidget *progress, GdkEvent *event, gpointer data);
  3. gboolean progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer data);
  4. gboolean progress_motion_notify (GtkWidget *progress, GdkEvent *event, gpointer data);

  5. int main (int argc, char* argv[])
  6. {
  7.   GtkWidget *window;
  8.   GtkWidget *label;
  9.   GtkWidget *progress;
  10.   GtkWidget *vbox;

  11.   gtk_init (&argc, &argv);

  12.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  13.   gtk_widget_set_size_request (window, 400, 300);

  14.   label = gtk_label_new ("mouse progress bar");
  15.   gtk_widget_show (label);

  16.   progress = gtk_progress_bar_new ();
  17.   gtk_widget_show (progress);
  18.   gtk_widget_set_size_request (progress, -1, 30);
  19.   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), 0.2);

  20.   gtk_widget_add_events (progress, GDK_BUTTON_RELEASE_MASK |
  21.                                    GDK_BUTTON_PRESS_MASK   |
  22.                                                                    GDK_POINTER_MOTION_MASK );
  23.   g_signal_connect (progress, "button-release-event",
  24.                     G_CALLBACK (progress_button_release), NULL);
  25.   g_signal_connect (progress, "button-press-event",
  26.                     G_CALLBACK (progress_button_press), NULL);
  27.   g_signal_connect (progress, "motion-notify-event",
  28.                     G_CALLBACK (progress_motion_notify), NULL);


  29.   vbox = gtk_vbox_new (FALSE, 5);
  30.   gtk_widget_show (vbox);

  31.   gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 5);
  32.   gtk_box_pack_start (GTK_BOX(vbox), progress, TRUE, FALSE, 5);

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

  34.   gtk_widget_show (window);

  35.   gtk_main ();

  36.   return 0;
  37. }

  38. gboolean
  39. progress_button_release (GtkWidget *progress, GdkEvent *event, gpointer data)
  40. {
  41.   GdkEventButton *eb = (GdkEventButton *)event;
  42.   GtkAllocation allocation;
  43.   gint pressed;

  44.   pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
  45. #if GTK_MINOR_VERSION >= 18
  46.   gtk_widget_get_allocation (progress, &allocation);
  47. #else
  48.   allocation = progress->allocation;
  49. #endif
  50.   if (pressed)
  51.     gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), eb->x / (allocation.width * 1.0));

  52.   g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)0);
  53.   return FALSE;
  54. }

  55. gboolean
  56. progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer data)
  57. {
  58.   g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)1);
  59.   return FALSE;
  60. }

  61. gboolean
  62. progress_motion_notify (GtkWidget *progress, GdkEvent *event, gpointer data)
  63. {
  64.   GdkEventMotion *em = (GdkEventMotion *)event;
  65.   gint pressed;
  66.   GtkAllocation allocation;

  67.   pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
  68. #if GTK_MINOR_VERSION >= 18
  69.   gtk_widget_get_allocation (progress, &allocation);
  70. #else
  71.   allocation = progress->allocation;
  72. #endif
  73.   if (pressed)
  74.   {
  75.     gdouble fraction = em->x / (allocation.width * 1.0);
  76.         if (fraction > 1.0)
  77.           fraction = 1.0;
  78.         if (fraction < 0.0)
  79.           fraction = 0.0;
  80.     gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), fraction);
  81.   }

  82.   return FALSE;
  83. }
复制代码
注意 gtk_widget_add_events

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
3 [报告]
发表于 2011-03-24 21:27 |只看该作者
本帖最后由 nketc 于 2011-03-24 21:33 编辑

录了个动画

3.gif (105.53 KB, 下载次数: 21)

3.gif

论坛徽章:
0
4 [报告]
发表于 2011-03-25 10:33 |只看该作者
谢谢nketc :
虽然我想问的是:如何通过鼠标拖拽使fixed中的一个Label控件自由移动,和用鼠标改变这个Label控件的大小。
但是你的示例却让我对于事件和信号之间的联系有了一定的认识。
谢谢。

另外我想问一下:Label需要添加在一个Eventbox内才可以接收信号。你的这个示例我想解决Label移动应该够了,但是改变大小的话,如何确定鼠标已经在Label的边缘了呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP