zoukankan      html  css  js  c++  java
  • duilib进阶教程 -- 改进窗口拖动 (12)

      现在大家应该都知道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")) != 0 )
                    return 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~





  • 相关阅读:
    【转】Selenium模拟JQuery滑动解锁
    【转】nose-parameterized是Python单元测试框架实现参数化的扩展
    【转】Chrome headless 模式
    RobotFramework:App九宫格滑动解锁
    appium九宫格解锁错误提示:The coordinates provided to an interactions operation are invalid解决办法
    RobotFramework:App滑动屏幕
    robotframework:appium切换webview后,在webview里滑动屏幕
    robotframework:appium切换webview后,在第一个页面操作成功,跳转到第二个页面后,执行命令失败
    robotframework之APP混合H5自动化测试
    Allure生成测试报告
  • 原文地址:https://www.cnblogs.com/Alberl/p/3404208.html
Copyright © 2011-2022 走看看