duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)
距离上一篇半透明窗体的博客,已经过去一年,现在这几天又对Duilib进行了一些优化和修复。这次我把CRenderEngine的渲染函数都改成了基于Gdi+的。根据我的测试,因为Duilib所需的都是最基本绘制功能,所以用Gdi+并不影响效率,同时又补充了alpha通道,让半透明异形窗体更完善。但是同时我保留了原Gdi渲染函数。通过USE_GDI_RENDER宏来控制是否使用Gdi渲染,默认使用Gdi+。
除了修改CRenderEngine,另外优化了CPaintManagerUI的WM_PAINT处理代码。针对分层窗体的alpha修复代码进行了修复,使用Gdi或者Gdi+渲染会使用不同的修复策略。
使用Gdi渲染时,因为界面整体都需要补充alpha通道,所以就遍历了整体的内存位图去补充。
使用Gdi+渲染时,因为本身就已经存在alpha通道,所以就只需要修补RichEdit控件的alpha通道。为此我在窗体属性里添加了一个richeditcorner属性:
richeditcorner属性的四个值,分别是RichEdit控件距离窗体左上右下的边距。
半透明异形窗体的缺陷还是在于无法嵌入有句柄子控件。解决方法有两个:一是用双层窗体的方法,主窗体主动控制子控件联动(迅雷用这样的方法,只要联动做得够好,效果上还是不错的)。二是在WM_PAINT中用SendMessage发子控件发送WM_PRINT效率得到子控件的位图,具体操作在官方Duilib中已经做好了。不过如果子控件是比较复杂的控件,这样的方法还是会有一些缺陷。所以最好还是用无窗模式的子控件,或者在一些比较复杂的场景里别使用半透明异形功能。
总结:
我之前一直以为使用UpdateLayeredWindow做的半透明异形窗体,在效率上会比较低。但是经过我测试居然发现,实际上效率并不低,反而会比普通的绘制方法效率还高。
如果使用半透明异形窗体,再需要加窗体阴影时也就不需要双层窗体了,直接在XML布局的最外层嵌套一个阴影图片即可。
现在的半透明异形功能差不多完善够了,加上效率也足够,用来做实际开发也差不多了。不过建议使用半透明异形功能的朋友最好对相关功能和API有一定了解,这样出了问题也能解决。
所有修改我都提交到我个人的Duilib库中,需要的朋友可以直接下载,或者进行文件对比提取对自己有用的代码:点击打开链接
Redrain QQ:491646717 2016.4.26
duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)相关推荐
- 使用duilib开发半透明异形窗体程序(附源码和demo)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/43532791 半透明异形窗体的功能在之前维护的老版本的duilib里面已 ...
- duilib设置透明窗口_界面开发心得与Duilib | 学步园
一.设置窗体透明度和指定透明色(如指定了黑色,即所有黑色的部分将会变得透明) DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); if((dwExSt ...
- vue.js反编译_基于electron-vue开发的微信小程序反编译客户端
开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...
- php开发桌面应用程序_使用PHP开发跨平台桌面应用程序的3种方法
php开发桌面应用程序 PHP as a cross-platform desktop app development language? Blasphemy! Nonetheless, it's p ...
- 设置作者_阿里Java开发手册建议创建HashMap时设置初始化容量,但多少合适
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...
- 安卓饼状图设置软件_安卓(Android)开发之自定义饼状图
先来看看效果图 先分析饼状图的构成,非常明显,饼状图就是一个又一个的扇形构成的,每个扇形都有不同的颜色,对应的有名字,数据和百分比. 经以上信息可以得出饼状图的最基本数据应包括:名字 数据值 百分比 ...
- python快递分拣小程序_利用Python开发的ATM小程序
最近在学习Python,便利用业余时间开发了一个模拟ATM抢银行的小程序,不废话,直接上程序 #!/usr/bin/env python #coding=utf-8 # Name: AtmCard.p ...
- qt修改程序图标名称_【Qt开发】更改应用程序图标和任务栏图标
说明 实际开发过程中,生成的应用文件不会用默认的图标,同时程序启动后任务栏的图标也需要修改,还有窗口的图标,这样显得程序不那么low.更改程序的图标有多种方式,基于Qt Creator或vs开发的方式 ...
- 扑克牌用java实现_用java开发的扑克牌游戏程序源代码
[实例简介] 主是一用java开发的扑克牌游戏项目的代码及相关资源,具有很大的参考价值.欢迎真正需要的人下载. [实例截图] [核心代码] ec940834-2821-4124-9822-7ceb14 ...
最新文章
- 【转载】C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
- 使用SoapUI 测试Web Service
- Shell学习笔记 - 环境变量配置文件(转)
- GARFIELD@04-14-2005
- php v-for=,Vue中v-for循环节点的实现代码
- 高德地图开发 怎么去除城市信息
- 孩子们的游戏(圆圈中最后剩下的数)
- [Ext JS 4] 实战之升级系列一[Ext jS 3--Ext JS 4]
- 客户让无数销售员卑躬屈膝的四大陷阱
- Sum All Odd Fibonacci Numbers-freecodecamp算法题目
- Qt连接SQL Server 2014数据库
- cad怎么表示出一个孔_怎么训练出一个NB的Prophet模型
- 典型传动机构的动力学模型
- tensorflow之get_shape
- 编写安全代码:小心使用浮点数
- 2014年9月16日----暴风影音笔试题
- uint 数据类型理解
- 如何实现网页上的气球提示
- Dline,一款让你爱不释手的去中心化社交应用
- iOS中常用的几种延时加载/执行的处理办法