duilib进阶教程 -- 改进窗口拖动 (12)
来源:互联网 发布:暗物质 暗能量知乎 编辑:程序博客网 时间:2024/06/06 00:03
嗯,这样是可以,比如窗口高度是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~
- duilib进阶教程 -- 改进窗口拖动 (12)
- duilib进阶教程 改进窗口的拖动
- duilib进阶教程 -- 改进List控件 (1)
- duilib进阶教程 -- 改进List控件 (16)
- duilib进阶教程 -- 改进List控件 (1)
- duilib : 窗口拖动
- duilib 无标题窗口拖动
- duilib创建可拖动窗口
- duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
- duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
- duilib进阶教程 -- 总结 (17)
- duilib进阶教程 -- 总结 (17)
- duilib进阶教程 -- 总结 (17)
- duilib进阶教程 -- 改进List控件(3)_支持多选+右键菜单(ctrl,shift, 鼠标滑动框选)
- duilib进阶教程 -- 改进List控件(3)_支持多选+右键菜单(ctrl,shift, 鼠标滑动框选)
- duilib进阶教程 -- 扩展duilib的消息 (11)
- duilib进阶教程 -- 在duilib中使用MFC (2)
- duilib进阶教程 -- 在MFC中使用duilib (1)
- duilib进阶教程 -- 改进List控件 (16)
- 网友汇总的IT笔试面试题
- duilib进阶教程 -- 设置资源路径 (15)
- duilib进阶教程 -- Container控件的bug (14)
- duilib进阶教程 -- 响应windows原生消息和自定义消息(13)
- duilib进阶教程 -- 改进窗口拖动 (12)
- duilib进阶教程 -- 扩展duilib的消息 (11)
- duilib进阶教程 -- 各种控件的响应 (10)
- iOS国际化时遇到的错误:read failed: the data couldn't be read because it isn't in the correct format.
- html&JavaScript&ajax部分
- duilib进阶教程 -- TreeView控件的bug (9)
- PHP面向对象:PHP中的多态
- duilib进阶教程 -- Label控件的bug (8)
- duilib进阶教程 -- TreeView控件的不足 (7)