关于viewport/container的消息传递

我通过把两个widget放到container内组装了一个新的控件,在测试时发现了问题,container内的两个widget无法接收消息,于是对container小研究了一下。在brew下container内如果插入的内容太多,超过它的宽度和高度,是直接通过滚动来显示的,需要先用一个viewport来装饰这个container,此时可以直接拖拉来看区域外的内容,为了更直观些,想要看到滚动条,需要再用一个scrollbar来装饰这个viewport.在我现在的应用中,有些区域内可能东西比较多,需要拖拉来显示,但加上滚动条看起来比较怪,所以就直接用了viewport.在初始化container时传进个参数,如果为真表示支持拖拉,此时需要viewport,如果为假,则不支持拖拉,直接初始化一个container就行了。然而用viewport装饰时,viewport的flag有三个值,分别为VWF_SIZETOFIT,VWF_DISABLEKEYHANDLING,VWF_CONSUMETOUCHEVENTS 。如果为了能让viewport支持拖拉,需要设置flag为VWF_CONSUMETOUCHEVENTS(我个人认为,因为看了一些文档说需要这样设置,但没找到文档说必须设置为这个值),还需要设定rootcontainer支持触摸事件IWidget_EnableTouch(pMe->m_pRootWidget);还需要设定它的touchmode,常用的主要有两种,AEEWIDGET_TOUCH_MODE_ALWAYS和AEEWIDGET_TOUCH_MODE_CHILD,文档里有说明用法,我也被他们折磨了很久。

(1)touchmode为AEEWIDGET_TOUCH_MODE_ALWAYS时。因为设置了viewport为VWF_CONSUMETOUCHEVENTS,消息传到它这里全部被它所“消费”,也就是说消息将不再向下传下去,所以,需要自己写程序把消息传给它的孩子,主要是通过事件的位置,算出命中的widget,并调用它的handleEvent函数,即把消息传递给它,但现在遇到的一个问题是,如果viewport里面是一个container,container里面是一个button,现在点击这个button,viewport先捕捉到消息,并把这个消息吃掉,然后在它的消息处理函数里面调用container的handleEvent函数,而通常情况下,container是不需要注册handle_event函数的,系统会自动把消息传给它内部的孩子,但此处消息已经被上层的viewport吃掉,所以,消息到ontainer后,无法再向下传递给它的孩子,我的工程就是用的这种方法,之前一直没有在viewport中插入过container,所以一直也没有发现这个问题(注:viewport中嵌套viewport消息是能正常传递的),这个问题把我卡了两个星期,中间尝试了第二种方法,感觉比这一种要好,但还是有个问题没解决。有个同事告诉我说系统内部有个消息链,在viewport这里消息链断掉的,我需要自己再把消息告诉container,让它继续把消息传下去。话虽这么说,但我却无从下手,考虑过container也做handleEvent函数,通过位置去投递消息,但这个项目当时设计的时候是特意去掉container的消息处理函数的,让系统自己传递消息来提高速度,我如果这样一改的话,等于把当时的设计又推翻了,最后折腾了很久,才通过IWidget_HandleEvent把消息传递下去,不过我的时间都是再第二种方法上浪费的,我相信第二种方法一定可以,可有个问题我一直没搞定。。。

(2)touchmode为AEEWIDGET_TOUCH_MODE_CHILD时。这种方法的话viewport会自动把消息传给他的孩子,应该比较智能。也支持拖拉。brew官网上有一个例子。如果正常使用的话我觉得可以满足一切需求了。但是目前我遇到的问题是给viewport设置过extent之后,例如我修改了它的例子,开始viewport 的extent设置为50*50,然后把它插入到rootcontainer内,接着修改它的extent为100*100,而它所修饰的container的大小为200*200,这时,可以拖拉viewport查看container内部所有的内容,但是container内的widget,只有在(0,0,50,50)的范围内才能接收到消息,也就是说调整后的viewport没有生效。我试了很多方法都没用。一般情况下viewport是不需要调整高度的,但我的项目初始化的时候不知道它的高度,先创建所有的widget和建立它们的关系,然后再 统一layout,所以没办法使用,浪费了很多时间,最终还是采用上面的方法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值