距离上一篇半透明窗体的博客,已经过去一年,现在这几天又对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开发半透明异形窗体程序(补充)相关推荐

  1. 使用duilib开发半透明异形窗体程序(附源码和demo)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/43532791 半透明异形窗体的功能在之前维护的老版本的duilib里面已 ...

  2. duilib设置透明窗口_界面开发心得与Duilib | 学步园

    一.设置窗体透明度和指定透明色(如指定了黑色,即所有黑色的部分将会变得透明) DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); if((dwExSt ...

  3. vue.js反编译_基于electron-vue开发的微信小程序反编译客户端

    开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...

  4. php开发桌面应用程序_使用PHP开发跨平台桌面应用程序的3种方法

    php开发桌面应用程序 PHP as a cross-platform desktop app development language? Blasphemy! Nonetheless, it's p ...

  5. 设置作者_阿里Java开发手册建议创建HashMap时设置初始化容量,但多少合适

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...

  6. 安卓饼状图设置软件_安卓(Android)开发之自定义饼状图

    先来看看效果图 先分析饼状图的构成,非常明显,饼状图就是一个又一个的扇形构成的,每个扇形都有不同的颜色,对应的有名字,数据和百分比. 经以上信息可以得出饼状图的最基本数据应包括:名字 数据值 百分比 ...

  7. python快递分拣小程序_利用Python开发的ATM小程序

    最近在学习Python,便利用业余时间开发了一个模拟ATM抢银行的小程序,不废话,直接上程序 #!/usr/bin/env python #coding=utf-8 # Name: AtmCard.p ...

  8. qt修改程序图标名称_【Qt开发】更改应用程序图标和任务栏图标

    说明 实际开发过程中,生成的应用文件不会用默认的图标,同时程序启动后任务栏的图标也需要修改,还有窗口的图标,这样显得程序不那么low.更改程序的图标有多种方式,基于Qt Creator或vs开发的方式 ...

  9. 扑克牌用java实现_用java开发的扑克牌游戏程序源代码

    [实例简介] 主是一用java开发的扑克牌游戏项目的代码及相关资源,具有很大的参考价值.欢迎真正需要的人下载. [实例截图] [核心代码] ec940834-2821-4124-9822-7ceb14 ...

最新文章

  1. 【转载】C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
  2. 使用SoapUI 测试Web Service
  3. Shell学习笔记 - 环境变量配置文件(转)
  4. GARFIELD@04-14-2005
  5. php v-for=,Vue中v-for循环节点的实现代码
  6. 高德地图开发 怎么去除城市信息
  7. 孩子们的游戏(圆圈中最后剩下的数)
  8. [Ext JS 4] 实战之升级系列一[Ext jS 3--Ext JS 4]
  9. 客户让无数销售员卑躬屈膝的四大陷阱
  10. Sum All Odd Fibonacci Numbers-freecodecamp算法题目
  11. Qt连接SQL Server 2014数据库
  12. cad怎么表示出一个孔_怎么训练出一个NB的Prophet模型
  13. 典型传动机构的动力学模型
  14. tensorflow之get_shape
  15. 编写安全代码:小心使用浮点数
  16. 2014年9月16日----暴风影音笔试题
  17. uint 数据类型理解
  18. 如何实现网页上的气球提示
  19. Dline,一款让你爱不释手的去中心化社交应用
  20. iOS中常用的几种延时加载/执行的处理办法

热门文章

  1. Spring框架——applicationContext.xml配置文件头部xmlns
  2. 每天两分钟 远离电脑病
  3. 到底该怎么学python啊?
  4. 团队协作一、onlyoffice协同开发使用
  5. 用户登录很重要,实现游戏陪玩app源码注册功能
  6. 单击Artwork时没有弹窗的问题
  7. java语言开发微信小程序(一)
  8. Android Studio掷骰子生成随机数(Java)
  9. 力扣每日一题(九——保持城市天际线)
  10. Python计算圆的周长与面积