关于DUILIB的遮罩,控件穿透以及其应用的分析实践

本文对Duilib的遮罩层以及及穿透进行相关的讨论,原理很简单,除了讨论实现外,在本文也讨论如何利用这些特性、原理来实现需求,欢迎讨论。

1.      
遮罩层的实现

在软件的UI显示中,我们经常会需要遮罩住整个窗口或者是窗口的一部分,以避免客户操作相应的UI,等待特定的操作完成之后才解除锁定。

其实这个在Duilib中,是非常容易实现的,好像还有不少人不太清楚,咱们这里就先来讨论一下这个。

Duilib绘制各个控件、响应控件的事件都是按层次从前往后进行处理的[可以简单的理解为XML节点的先后顺序],也就是说位置越靠后的在UI显示层次越高;那么,我们如果在足够靠后的位置放置一个float的控件,控制好他的位置,将需要遮罩的区域覆盖住的话,是不是就能够实现遮罩了呢?

答案是肯定的。

以Duilib中的TestApp为例,我们在其XML而已文件的最外层的Layout最后,添加如下代码【这是为了遮罩整个窗口,如果只要遮罩部分,调整一下即可】:

<span style="font-size:14px;"><Control float="true"bkcolor="#66000000" name="cover"pos="0,0,1000,1000" /></span>

其中这个bkcolor表示是黑色,以及一定的透明度,就这样我们就完成了一个遮罩层了,在程序中,只要适当的控制好此控件的显示隐藏以及位置大小即可。

看看效果【只遮挡上半部分】:

2.      
控件的穿透

还有另外一种需求,就是当有两个控件有重叠的时候,我想鼠标操作时,直接操作下面的那个控件,而不要被上面的控件把事件给拦截了,这就引出了控件的穿透问题。

为什么会有这样的需求呢?

举一个简单的例子,QQ的图片查看器,在通过鼠标滚轮滚动时,能调整它的显示比例,同时会有一个比例大小的显示,如下图:

但当鼠标在120%这个位置点击拖动时,与它没有显示时一样;如果我想用Duilib来实现的话,这就是一种穿透了【当然有别的实现方法,比如我们自己在此处绘制相应的图片和文字,但我们现在讨论的是如何利用Duilib来实现】。

如果觉得这个需求没什么意义,咱们讨论点有意思的看看:

1)      假如你在做一个图书阅读的软件,天晚了,如果可以降低阅读的软件亮度,又不影响对软件的操作,是不是比较贴心?

2)      如果可以给一个文本输入框增加一个前景半透明的图片,且不影响文字输入,是不是比加个背景色更显高大上?

3)      如果你做的是一个比较煊的界面,上面在放着鞭炮,软件双可以继续操作,是不是比较酷?

4)      更多的特效,在功能上支持后,就可以任意发挥你的想象力了,可以在评论里回复。

说了这么多,咱们还是来讨论如何实现控件的穿透吧,其实很简单,在强大的Duilib下,我们只需要给CControlUI增加一个属性,然后再增加一个判断就搞定了。

步骤:

1)      给CControlUI增加一个成员变量:m_bEnableEvent,表示是否支持事件,为否则表示穿透,这里需要在构造函数中将其默认为true,否则你的窗口将不能被操作了。

2)      在CPaintManagerUI::__FindControlFromPoint函数中,如果当前控件的m_bEnableEvent为false,则直接返回NULL即可,代码如下:

CControlUI* CALLBACKCPaintManagerUI::__FindControlFromPoint(CControlUI* pThis, LPVOID pData)

{

    if (!pThis->m_bEnableEvent)

    {

        return NULL;

    }

    LPPOINTpPoint = static_cast<LPPOINT>(pData);

    return ::PtInRect(&pThis->GetPos(), *pPoint)? pThis : NULL;

}

3)      如果想要哪个控件可以穿透,直接将其m_bEnableEvent设置为false即可。以下在OnPrepare中将遮罩层及一个按钮设置为穿透:

m_pm.FindControl(_T("cover"))->m_bEnableEvent = false;

m_pm.FindControl(_T("insertimagebtn"))->m_bEnableEvent = false;

进一步处理的话,在XML中增加这个属性,并且在解析XML的地方增加对此属性的解析与赋值,就更加灵活了。

实现效果如下[可以点击遮罩层下的任意区域,输入信息]:

代码下载:

http://download.csdn.net/detail/tragicguy/8950067

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 22:45:06

关于DUILIB的遮罩,控件穿透以及其应用的分析实践的相关文章

Duilib教程-控件练习

一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为“btnClose”. 然后在 CHelloDuilibWnd 中重载 WindowImplBase::Notify (); 代码如下: void CHelloDuilibWnd::Notify( TNotifyUI& msg ) { if (msg.sType == DUI_MSGTYPE_CLI

DuiLib的Combo控件点击无响应的问题

注:此问题具有特殊性,不具有普适性.结果虽然让人很崩溃,但毕竟折磨了自己一个下午的时间,记录下来永记于此. 今天的DuiLib开发过程中遇到了一个Combo点击没有反应,无法弹出下拉菜单的问题.此问题一出,遍寻网络无果,最终通过自己灵光一闪的思考,终于找到问题的原因. 在不久前,为了让整个窗口都能够拖动,于是在xml中将Caption设置为了整个窗口,然后在代码的OnNcHitTest()函数中增加当时有的几个需要点击的控件.当这次添加Combo控件后,将这件事情忘记了.于是在这种情况下点击Co

duilib中CListUI控件消息处理的方法与技巧

CListUI控件是duilib中比较常用.也是比较遇到问题的控件,使用CListUI可以简单的实现类似各类软件管家软件列表的样式与功能.但是CListUI使用时经常有小伙伴经常为遇到的各种小问题而头疼,下面我们重点总结一下: 常见问题: 1.如何隐藏列表头:List控件属性里面添加header="hidden"即可 2.如何调整列表文字对齐方式: List控件属性里面修改itemalign即可(List控件中列表项的属性配置都是在List属性列表进行的,只不过在普通控件属性的基础上添

Duilib实现GroupBox控件

转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是没有给控件设置borderround属性,后来设置后出来效果: 最后放上源码(稍微做了修改): .h文件 1 #ifndef _UIGROUPBOX_H_ 2 #define _UIGROUPBOX_H_ 3 4 #define GROUPBOX_TEXT_OFFSET 40 //定义GroupBo

DuiLib 自定义识别控件

遇到一个断点无法识别自定义的控件,运气比较好,一搜就搜出来了: 参考地址:http://www.bkjia.com/ASPjc/992050.html 主要是这个函数: CControlUI* CDialogBuilder::Create(STRINGorID xml, LPCTSTR type, IDialogBuilderCallback* pCallback, CPaintManagerUI* pManager, CControlUI* pParent) 这个函数 的第一个参数指定为xml

duilib 的IE浏览器控件去边框和去滚动栏的代码

转载请说明原出处,谢谢~~ 近些天在duilib群里常常有朋友问起,怎么让duilib的IE控件能够去边框.去滚动栏的问题,或者是怎样去控件IE控件的行为.为了避免反复的回答,我就写一篇博文,把处理方法说明一下. duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装.使用IE控件的话就用他了. 这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为. 而这个函数须要一个CWebBrowse

修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控件中切换,但是切换焦点一直存在bug,具体的描述如下: 1.在主窗体里弹出新的窗体,当新窗体中存在CEditUI控件并且焦点在此CEditUI控件上,那么按tab键将无法切换焦点而一直处于CEditUI中.(只在新窗体中有此bug,主创体中没有,原因会在后面分析) 2.CWebBrowserUI控件

duilib 的IE浏览器控件去边框和去滚动条的代码

近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为.为了避免重复的回答,我就写一篇博文,把处理方法说明一下. duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装,使用IE控件的话就用他了.这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为.而这个函数需要一个CWebBrowserEventHandler对象指

仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源代码)

转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就仅仅剩下调色板功能没有做了.我本以为会非常easy.可是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1aG9uZ3NodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > waterm