GTK 鼠标拖拽fixed内的控件产生不连贯移动?

发布于 2022-10-15 06:53:11 字数 178 浏览 21 评论 0

建立fixed控件,其中put一个eventbox控件。
想通过鼠标来移动eventbox控件。但是发现在移动的过程中,发现控件移动并不连贯,而且频繁上,下,左,右晃动。
另外:如果通过鼠标拖拽,用move函数来移动固定的位移,就不会出现上述情况。
请问这两种情况有区别么?(手抖的情况不算)。
该怎么解决?

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

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

发布评论

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

评论(6

夜夜流光相皎洁 2022-10-22 06:53:11

gtk绘制采用的是“idle”机制。gtk_widget_queue_draw等并不是真正的绘制,只是发了个消息。只有在main loop循环不忙的时候才开始真正的绘制。gtk对用户事件(鼠标拖动,按键等)处理的优先级比绘制高,这样会使多个绘制消息的动作合并为一次绘制。这可能是你提到的“不联惯”的原因。

然而gtk也提供了同步绘制的方法:gdk_window_process_updates,在gtk_widget_queue_draw后使用它即可。gdk_window_process_updates会完成实际的绘制工作(如果有绘制工作的话)

只是一片海 2022-10-22 06:53:11

nketc: 谢谢你的答复。
我不清楚你的方法是什么。我是用gtk_fixed_move(GTK_FIXED(fixed), widget, h_position, v_position)来实现控件在fixed上面移动而不是绘制的。
(也许是我不应该用这种方法吧)

以下是关于“motion-notify-event”信号处理的部分。
                               // 取得当前鼠标位置
                        pointer_x = em->x;   
                        pointer_y = em->y;
                        // 取得鼠标偏移量
                                                tempx = (gint)pointer_x-(gint)pointer_x_back;
                        tempy = (gint)pointer_y-(gint)pointer_y_back;
                                                // 取得当前控件的位置
                        window_hp += tempx;
                        window_vp += tempy;
                                                // 移动控件
                        gtk_fixed_move(GTK_FIXED(fixed), eventbox_window, window_hp, window_vp);
                                                // 保留本次鼠标位置
                        pointer_x_back = pointer_x;
                        pointer_y_back = pointer_y;

如果使用gtk_fixed_move函数该怎么解决这个问题呢?有没有更好的方法呢?
nketc, 我会把你说的方法研究一下的,谢谢

不及他 2022-10-22 06:53:11

另外,我把gdk_window_process_updates夹在程序里。

// 取得当前鼠标位置
pointer_x = em->x;   
pointer_y = em->y;

// 取得鼠标偏移量
tempx = (gint)pointer_x-(gint)pointer_x_back;
tempy = (gint)pointer_y-(gint)pointer_y_back;

// 取得当前控件的位置
window_hp += tempx;
window_vp += tempy;

// 移动控件
gtk_fixed_move(GTK_FIXED(fixed), eventbox_window, window_hp, window_vp);
gdk_window_process_updates(eventbox_window->window, TRUE);

// 保留本次鼠标位置
pointer_x_back = pointer_x;
pointer_y_back = pointer_y;

情况还是一样,没有变化。

猥︴琐丶欲为 2022-10-22 06:53:11

为什么用鼠标拖动窗口不会发生不连干的问题,而拖动控件(除窗口)就会发生不连贯的问题。

地狱即天堂 2022-10-22 06:53:11

不一个地方,拖动窗口是窗口管理实现的gnome是metacity,拖动空间是gtk中的。

甜宝宝 2022-10-22 06:53:11

为什么,在拖动窗口的回调函数中,运行fixed内控件的移动函数(gtk_fixed_move(GTK_FIXED(fixed), eventbox_window, window_hp, window_vp);),控件就可以平滑的移动;
而在拖动fixed中控件的回调函数中,运行fixed内控件的移动函数(gtk_fixed_move(GTK_FIXED(fixed), eventbox_window, window_hp, window_vp);),控件却发生不连贯的移动?

该怎么理解和解决呢?

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