免费注册 查看新帖 |

Chinaunix

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

GTK 鼠标拖拽fixed内的控件产生不连贯移动? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-16 18:25 |只看该作者 |倒序浏览
建立fixed控件,其中put一个eventbox控件。
想通过鼠标来移动eventbox控件。但是发现在移动的过程中,发现控件移动并不连贯,而且频繁上,下,左,右晃动。
另外:如果通过鼠标拖拽,用move函数来移动固定的位移,就不会出现上述情况。
请问这两种情况有区别么?(手抖的情况不算)。
该怎么解决?

论坛徽章:
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-05-16 23:57 |只看该作者
gtk绘制采用的是“idle”机制。gtk_widget_queue_draw等并不是真正的绘制,只是发了个消息。只有在main loop循环不忙的时候才开始真正的绘制。gtk对用户事件(鼠标拖动,按键等)处理的优先级比绘制高,这样会使多个绘制消息的动作合并为一次绘制。这可能是你提到的“不联惯”的原因。

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

论坛徽章:
0
3 [报告]
发表于 2011-05-17 09:41 |只看该作者
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, 我会把你说的方法研究一下的,谢谢

论坛徽章:
0
4 [报告]
发表于 2011-05-17 09:49 |只看该作者
另外,我把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;

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

论坛徽章:
0
5 [报告]
发表于 2011-06-18 09:31 |只看该作者
为什么用鼠标拖动窗口不会发生不连干的问题,而拖动控件(除窗口)就会发生不连贯的问题。

论坛徽章:
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
6 [报告]
发表于 2011-06-18 15:02 |只看该作者
不一个地方,拖动窗口是窗口管理实现的gnome是metacity,拖动空间是gtk中的。

论坛徽章:
0
7 [报告]
发表于 2011-06-20 10:05 |只看该作者
为什么,在拖动窗口的回调函数中,运行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);),控件却发生不连贯的移动?

该怎么理解和解决呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP