duilib进阶教程 改进窗口的拖动

原文地址:http://www.byywee.com/page/M0/S915/915037.html


如今大师应当都知道caption="0,0,0,32",是指导题目栏区了吧,若是想要全部窗口都能拖动呢? 那直接把高度改成和窗口一样不就得了~O(∩_∩)O~

  嗯,如许是可以,比如窗口高度是600,那么我们指定caption="0,0,0,600",如许全部窗口就可以拖动了,然则若是窗口大小改变了呢?假如调剂窗口的大小到800,这个时辰最下面的200个像素的高度就不克不及拖动啦,是以这里进行一个改进,也是举手之劳,在WindowImplBase::OnNcHitTest里的


  RECT rcCaption = m_PaintManager.GetCaptionRect(); 下面添加



    if (-1 == rcCaption.bottom)

    {

        rcCaption.bottom = rcClient.bottom;

    }


  如许只须要指定caption="0,0,0,-1",不管窗口大小如何变,都可以全部窗口拖动啦~


  不干预干与题又来了,当鼠标移到Slider、TreeView等控件上方时,可以发明这些控件都没有响应啦。这是因为下面只断定了ButtonUI、OptionUI、TextUI,所以我们须要打消掉其他控件,Slider好办,加上SliderUI的断定就OK了,TreeView控件就不克不及这么加啦,因为TreeView是由很多子控件构成的,很显然,这里须要遍历获取到父窗口,断定父窗口的类型。然而还有一个题目就是,改了SliderUI之后,可以发明还有ActiveX、Edit、List等一大波控件须要处理惩罚,就如许直接加上十几个断定当然可以解决题目,然则若是后面又加了几个控件呢? 这里不就得跟着改? 是以这里采作废除法,不管之后加一个还是十个控件,都不须要再批改这里。而TreeView控件的遍历也是一样,采作废除法,是以Alberl供给了一个函数IsInStaticControl用来断定是否在静态控件中,这里的静态控件和MFC一样,指的是Static、Text、Picture等文本控件。


  这时,我们只需将这段代码



    RECT rcCaption = m_PaintManager.GetCaptionRect();

    if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right         && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {

            CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(pt));

            if( pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && 

                _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0 &&

                _tcsicmp(pControl->GetClass(), _T("TextUI")) != 0return HTCAPTION;

    }



    return HTCLIENT;


  换成这段代码即可:



    // bottom为-1时,则全部窗口的高度都可以拖动

    RECT rcCaption = m_PaintManager.GetCaptionRect();

    if (-1 == rcCaption.bottom)

    {

        rcCaption.bottom = rcClient.bottom;

    }



    if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right

        && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) 

    {

        CControlUI* pControl = m_PaintManager.FindControl(pt);

        if (IsInStaticControl(pControl))

        {

            return HTCAPTION;

        }

    }



    return HTCLIENT;


  


  


  IsInStaticControl函数的代码如下:



// 包含头文件#include <algorithm>

BOOL WindowImplBase::IsInStaticControl(CControlUI *pControl)

{

    BOOL bRet = FALSE;

    if (! pControl)

    {

        return bRet;

    }



    CDuiString strClassName;

    std::vector<CDuiString> vctStaticName;



    strClassName = pControl->GetClass();

    strClassName.MakeLower();

    vctStaticName.push_back(_T("controlui"));

    vctStaticName.push_back(_T("textui"));

    vctStaticName.push_back(_T("labelui"));

    vctStaticName.push_back(_T("containerui"));

    vctStaticName.push_back(_T("horizontallayoutui"));

    vctStaticName.push_back(_T("verticallayoutui"));

    vctStaticName.push_back(_T("tablayoutui"));

    vctStaticName.push_back(_T("childlayoutui"));

    vctStaticName.push_back(_T("dialoglayoutui"));



    std::vector<CDuiString>::iterator it = std::find(vctStaticName.begin(), vctStaticName.end(), strClassName);

    if (vctStaticName.end() != it)

    {

        CControlUI* pParent = pControl->GetParent();

        while (pParent)

        {

            strClassName = pParent->GetClass();

            strClassName.MakeLower();

            it = std::find(vctStaticName.begin(), vctStaticName.end(), strClassName);

            if (vctStaticName.end() == it)

            {

                return bRet;

            }



            pParent = pParent->GetParent();

        }



        bRet = TRUE;

    }



    return bRet;

}


  


  如许不管大小怎么变,窗口都可以全屏拖动啦~O(∩_∩)O~





来自为知笔记(Wiz)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值