使用duilib开发半透明异形窗体程序(补充)

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/51250537

       

         关于半透明异形窗体的第一篇文章地址为:http://blog.csdn.net/zhuhongshu/article/details/43532791

        距离上一篇半透明窗体的博客,已经过去一年,现在这几天又对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属性:

	<Attribute name="richeditcorner" default="0,0,0,0" type="RECT" comment="窗口中所有的RichEdit控件与窗体的边距,用于在异形半透明窗体中修复RichEdit控件的alpha通道(只有在bktrans为true并且使用Gdi+渲染时指定)"/>

        richeditcorner属性的四个值,分别是RichEdit控件距离窗体左上右下的边距

        半透明异形窗体的缺陷还是在于无法嵌入有句柄子控件。解决方法有两个:一是用双层窗体的方法,主窗体主动控制子控件联动(迅雷用这样的方法,只要联动做得够好,效果上还是不错的)。二是在WM_PAINT中用SendMessage发子控件发送WM_PRINT效率得到子控件的位图,具体操作在官方Duilib中已经做好了。不过如果子控件是比较复杂的控件,这样的方法还是会有一些缺陷。所以最好还是用无窗模式的子控件,或者在一些比较复杂的场景里别使用半透明异形功能。

总结:

        我之前一直以为使用UpdateLayeredWindow做的半透明异形窗体,在效率上会比较低。但是经过我测试居然发现,实际上效率并不低,反而会比普通的绘制方法效率还高。

       如果使用半透明异形窗体,再需要加窗体阴影时也就不需要双层窗体了,直接在XML布局的最外层嵌套一个阴影图片即可。

       现在的半透明异形功能差不多完善够了,加上效率也足够,用来做实际开发也差不多了。不过建议使用半透明异形功能的朋友最好对相关功能和API有一定了解,这样出了问题也能解决。

       所有修改我都提交到我个人的Duilib库中,需要的朋友可以直接下载,或者进行文件对比提取对自己有用的代码:点击打开链接

Redrain QQ:491646717  2016.4.26

时间: 2024-10-01 22:34:52

使用duilib开发半透明异形窗体程序(补充)的相关文章

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

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/43532791                  半透明异形窗体的功能在之前维护的老版本的duilib里面已经有了基本的功能,但是因为一直存在较多的缺陷,所以我一直建议少用,就连我自己写仿酷狗项目也只是在几个小地方用了半透明异形窗体.不过今天在群里和其他几位朋友讨论后,发现了之前的许多问题以及解决方法.所以我立马修复了当前的库,并且写了一个半透明异形窗体的demo来测试效

游戏开发-想学习窗体程序的编写,从启动图(图1),到界面(图2),需要学习哪些知识?

问题描述 想学习窗体程序的编写,从启动图(图1),到界面(图2),需要学习哪些知识? 试着编写一个从启动图(图1),到界面(图2)的程序,学习过c++编写程序开发-想学习窗体程序的编写,从启动图(图1),到界面(图2),需要学习哪些知识?-"> 解决方案 window窗体界面 现在流行的是MFC, C# ,Qt(delphi 和VB现在用的人少了),想学游戏开发,大概有2个方向吧,一个是平面二维游戏,一个是3D游戏 Unity引擎基础必须要学习,openGL 等图像处理技术, 解决方案二:

vs2010开发的窗体程序 数据库使用access如何打包成安装文件

问题描述 vs2010开发的窗体程序数据库使用access如何打包成安装文件,我尝试了多次但是都是不成功,求大神文档 解决方案 解决方案二: 解决方案三:引用1楼guwei4037的回复:access数据库直接加在到里面就可以了是吗?解决方案四:access不是直接一个文件就行了嘛

VB2008开发的winows窗体应用程序在其他电脑没法运行

问题描述 我用VB2008开发的winows窗体应用程序,将整个release目录拷贝到另外一台电脑后没法运行.出现如下错误窗口 解决方案 解决方案二:先把环境描述清楚比如.net什么版本,操作系统什么版本,开发环境和运行环境一致吗解决方案三:引用1楼Z65443344的回复: 先把环境描述清楚比如.net什么版本,操作系统什么版本,开发环境和运行环境一致吗 操作系统是WIN7专业版开发工具是VS2008.NET在我电脑上2,3,3.5都有,我把程序拷贝到另外一台.net3.5的电脑上反正是不行

C# 开发窗体程序 局域网传输文件

问题描述 C#开发窗体程序局域网传输文件.scoket......谁有小例子的教我一下.邮箱:accpyuan@vip.qq.com.例:就是A客户端给B,C,D,客户端传文件.保存在哪里呢?怎么传呢?哎.不懂网络的啦 解决方案 解决方案二:你先学会传一句话,再说传文件的问题解决方案三:如果你连电脑A怎么给电脑B发一个字符串"ABC"都不会也就是根本不知道socket是啥,而只是道听途说了这么个名词那么后面的具体思路和做法,是根本没法和你沟通的,因为说了啥你都听不懂

duilib开发基础:创建自定义控件的过程

转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/45362751        用Duilib开发界面时,很多情况下库自带的控件不满足需求,就需要基于Duilib建立自定义控件(自绘新的控件,或者用来封装win32的子窗体,来显示视频.网页等).        在群里经常会有刚接触Duilib的朋友问题怎么建立自己的自定义控件,或者建立的控件无法正常创建出来.我简单写一篇博客,把创建自定义控件的完整过程,和一些注意事项说明

使用 C# 和 C++.NET 开发的 .NET 应用程序实例列表

c++|程序 概述 本文档列出了 Crystal Decisions 技术支持网站上所有可用的,使用 C# 和 C++.NET 开发的 .NET 应用程序实例列表.本文档还给出了每一个程序的描述和下载链接.随着新程序加入我们的支持站点,本文档将不断更新.---------------------------------- 目录 VISUAL C# .NET 一.数据库连通性 1.csharp_web_simplelogonengine.exe 2.csharp_web_simplelogonvi

用C#开发UDP协议聊天程序

本节将通过一个实例来讲解,如何利用UDP协议开发多点聊天室程序.首先应在不同的计算机中运行聊天室服务程序,然后打开相应的客户发送端窗体,在客户发送端窗体的文本框中输入与之聊天的计算机IP,然后在"发送聊天信息"文本框中输入聊天信息,单击[发送]即可以将信息发送到目标计算机中. 服务器端实现的具体步骤如下: (1)在VS2005工程中添加一个窗体. (2)首先在代码设计器窗口中引入using System.Net.Sockets和using System.Net命名空间. (3)程序主要

VSTO 3.0: 用Visual Studio 2008开发Office业务应用程序

本文讨论: Visual Studio 2008 新增功能 为 Outlook 创建自定义窗体区域 连接数据源 添加搜索功能 本文使用了以下技术: Visual Studio 2008 到目前为止,我敢确定您已经听说了一些有关 Visual Studio 2008 的趣闻,它具有一些强大的功能,如支持 LINQ.改进了 Web 开发以及与 Windows Vista 和 SharePoint 紧密集成等等.不过 Visual Studio 2008 真正突出的一个特点是支持 Microsoft