GTK 鼠标拖拽fixed内的控件产生不连贯移动?
建立fixed控件,其中put一个eventbox控件。
想通过鼠标来移动eventbox控件。但是发现在移动的过程中,发现控件移动并不连贯,而且频繁上,下,左,右晃动。
另外:如果通过鼠标拖拽,用move函数来移动固定的位移,就不会出现上述情况。
请问这两种情况有区别么?(手抖的情况不算)。
该怎么解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
gtk绘制采用的是“idle”机制。gtk_widget_queue_draw等并不是真正的绘制,只是发了个消息。只有在main loop循环不忙的时候才开始真正的绘制。gtk对用户事件(鼠标拖动,按键等)处理的优先级比绘制高,这样会使多个绘制消息的动作合并为一次绘制。这可能是你提到的“不联惯”的原因。
然而gtk也提供了同步绘制的方法:gdk_window_process_updates,在gtk_widget_queue_draw后使用它即可。gdk_window_process_updates会完成实际的绘制工作(如果有绘制工作的话)
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, 我会把你说的方法研究一下的,谢谢
另外,我把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;
情况还是一样,没有变化。
为什么用鼠标拖动窗口不会发生不连干的问题,而拖动控件(除窗口)就会发生不连贯的问题。
不一个地方,拖动窗口是窗口管理实现的gnome是metacity,拖动空间是gtk中的。
为什么,在拖动窗口的回调函数中,运行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);),控件却发生不连贯的移动?
该怎么理解和解决呢?