GTK 如何用鼠标拖动event窗口

发布于 2022-09-30 19:24:58 字数 123 浏览 22 评论 0

建立了一个Even窗口,用来接收事件信息。但是为什么不能用鼠标进行拖动和改变大小?

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花期渐远 2022-10-07 19:24:58

回复 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

方觉久 2022-10-07 19:24:58

本帖最后由 nketc 于 2011-03-24 21:33 编辑

录了个动画

九歌凝 2022-10-07 19:24:58

谢谢nketc :
虽然我想问的是:如何通过鼠标拖拽使fixed中的一个Label控件自由移动,和用鼠标改变这个Label控件的大小。
但是你的示例却让我对于事件和信号之间的联系有了一定的认识。
谢谢。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文