Duilib中带有权重的灵活控件排列实现(一)

在开发播放器软件过程中,因为窗口的大小是可变的,为了让控制栏部分的控件(播放,上一集,下一集,全屏,字幕等)适应窗口的尺寸的变化而显示隐藏,产品经理会定义一系列的规则,好让在任何时候都最核心的功能提供给用户使用。
先列一下产品经理给予的需求:
1.两边往中间缩,保证左侧LOGO和右侧X最优先显示。
2.顶部隐藏优先级:搜索栏,换肤,意见反馈,播放记录,最小化,最大化
3.底部隐藏优先级:全屏,画质增强,无痕,打开文件,播放顺序,音量条

在处理这个需求过程中,前人也尝试了一些方法,比较通过全float绝对布局的方式,自己通过管理类来完全订制。而我个人还是希望通过而优雅的相对布局,并利用Container自身的排布算法来实现。经过几天的探索,大致实现上这种效果,在此分享一下思路与实现。

在分析此需求时,我希望引来类似于第3维的权重(weight)概念,即当父容器所提供的位置不足于将所有子控件摆放显示完全时,就按照重要性自低到高依次隐藏,将该控件的显示腾出来提供给更为重要的控件来摆放,简单推演一下,应该是可行的,按照这样简单的规则,可以比较轻松地解决这个需求,并且代码维护起来相对简单。只需要一个能够按照子控件的weight值来排列的父容器,命名为CWeightHorizontalLayoutUI。

OK,让我们来实现这个父容器,首先我介绍一下 CHorizontalLayoutUI::SetPos的方法。
其实就是两次for循环,前一次来试算,将没有设置宽度的控件记录下来,将剩余的空间求个平均数,设置给自适应的控件,而设置了宽度的控件则按设置的值排布。

    void CWeightHorizontalLayoutUI::SetPos(RECT rc)
    {
        CControlUI::SetPos(rc);
        rc = m_rcItem;

        std::map<CControlUI*, int /*width*/> mapAjust;
        // Adjust for inset
        rc.left     += m_rcInset.left;
        rc.top      += m_rcInset.top;
        rc.right    -= m_rcInset.right;
        rc.bottom   -= m_rcInset.bottom;

        if (m_items.GetSize() == 0) {
            ProcessScrollBar(rc, 0, 0);
            return;
   
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值