现在大家应该都知道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~

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/Alberl/p/3404208.html

duilib进阶教程 -- 改进窗口拖动 (12)相关推荐

  1. duilib进阶教程 -- 在MFC中使用duilib (1)

    由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...

  2. duilib进阶教程 -- 实现List排序

    需求: 点击List的某个ListHeaderItem,List按照此列排序. 实现思路:在C#中好多控件都支持排序,如gridview,只要配置相应属性并实现一些方法就可以了,但duilib就不行了 ...

  3. STM32 进阶教程 12 - M4的硬件乘法器使用

    前言 Cortex-M4支持硬件浮点运算单元(有些厂商直接说成DSP模块),本节将给大家介绍STM32F407芯片中硬件浮点运算单元中的使用及带来的性能对比. 示例详解 基于硬件平台: 正点源子的st ...

  4. Django进阶教程

    Django进阶教程 Queryset特性及高级查询技巧 什么是QuerySet QuerySet是Django提供的强大的数据库接口(API).正是因为通过它,我们可以使用filter, exclu ...

  5. STM32 进阶教程 9 - 芯片维一码(UID)读取

    前言 在嵌入式设备开发过程中有时会需要为设备设置唯一的ID用以标识设备唯一,比如要求同一总线上的所有设备ID不能重复,要求设备具体唯一的MAC地址等等.其实STM32的及其它类型的MCU如ATMEL, ...

  6. NAS群晖DSM 进阶教程 篇三:DSM 4458 升级 DSM 4493 update7

    WOW唤醒NAS手机APP: Windows Phone 8.1测试可用"Wake my PC"的详细信息  http://www.windowsphone.com/s?app ...

  7. NSIS进阶教程(一)~(五)

    这问是在学NSIS的时候发现的,一篇绝顶好文,当时没转过来,现在美化完程序了,想着不美化安装包也太不厚道了点...所以... NSIS进阶教程(一) 来自: http://www.pylife.net ...

  8. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  9. M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形

    M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形 引用: M8 SDK教程- 游戏开发心得(一): 游戏程序框架 http://bbs.mei ...

最新文章

  1. JDBC query VARRAY on DB level
  2. java 数组 length 减少_java中数组有没有length()方法?string没有lenght()方法?
  3. Tomcat源代码解析系列
  4. 二刻拍案惊奇之——国人为什么那么轻视技术
  5. 详解 | Spring Boot 最核心的 3 个注解详解
  6. linux怎样ping域名看不到ip,在linux下,ping域名ping不了,ping ip却可以解决办法
  7. 用Java实现邮件的发送
  8. Matlab 检测直线并求解直线方程
  9. [硬件技术] 教你如何挑选主板:电脑主板质量好坏的鉴别方法
  10. 在FuchsiaOS,AI助手和软件优化上
  11. 海洋地球物理探测方法综述(二)
  12. 计算机主机爆炸,意外:插入计算机后,主机的电源就会烧断。发生了什么?计算机电源爆炸了吗?...
  13. matlab 广义特征,特征值 特征向量 广义特征值 matlab
  14. GoLang - Go中Mocking(3)
  15. 小米3c路由器拆机_路由器也智能,小米路由器3C使用心得 - IT168试客
  16. iOS 修改导航栏背景色
  17. 比字节还小的计算机单位,电脑里,字节是最小单位吗
  18. Android Selinux avc报错分析
  19. 小白量化学习(4)基本面选股与股票池
  20. 台式电脑怎么卸载计算机,有些电脑软件卸载不了怎么办?电脑安装的软件无法卸载解决方法...

热门文章

  1. springmvc 中文文档
  2. docker运行我们的容器
  3. 刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!
  4. 在思科无线控制器上查看5GHz和2.4GHz的客户端数量
  5. 虚拟主机用户ftp和apache用户文件互操作权限解决方法
  6. Java学习笔记之equals和Objects.equals
  7. Java 多线程(三) 线程的生命周期及优先级
  8. 路由器与交换机的工作原理
  9. QT pro文件详解
  10. C#halcon点拟合圆形函数