duilib里面隐含的一个可能递归的bug

duilib的容器的滚动条是根据子控件来判断是否展示的。如果父控件可以根据情况在SetPos里面动态调整子控件的大小,在这个条件下,存在这样一种情况:

1.滚动条一开始不展示。

2.容器控件SetPos里面自动计算出子控件需要展示滚动条,ProcessScrollBar里面展示了滚动条并重新调用SetPos来重新计算子控件位置。

3.滚动条展示后,SetPos里面重新调整了子控件的大小,计算了滚动范围等,ProcessScrollBar里面发现新的子控件大小算出来的范围又不需要滚动条了,于是不展示滚动条,并再次调用SetPos来重新计算子控件位置。

4.这样又会回归1.2,形成递归调用。最终导致程序崩溃。

修复办法(两种):

1.可以尝试在Setpos里面来继续根据cyNeed判断是否展示滚动条,然后直接把滚动条是否展示给设置好,这样到ProcessScrollBar里面不会形成递归。

2.ProcessScrollBar里面修改,避免SetPos(GetPos())这样的代码,改为调用NeedUpdapte这样的来触发重绘来重新进入SetPos计算,避免递归调用。

第二种需要自行修改duilib库源码,或者派生新的控件来处理,应该是没有什么问题的。这两种办法我都没有严格测试。请谨慎。

猜你喜欢

转载自blog.csdn.net/u012081284/article/details/114102355