APP下载

基于LayeredWindow的异形窗体局部刷新

2014-03-06魏振钢张恩伟

中文信息 2014年2期
关键词:窗体画布异形

魏振钢 张恩伟

摘 要:通过对现存界面库的分析,解释当前异形窗体的创建与刷新的难点,及刷新时CPU占用率高的问题,通过对updateLayeredwindow接口的深度剖析,阐述了利用双界面合成的方法来模拟局部刷新。采用先对局部窗体重绘,然后与原界面合成的方法,大量减小了刷新时的重绘量,从而大幅度减轻了CPU的占用率。

关键词:界面 异形窗体updateLayeredwindow 局部刷新

中图分类号:TP3011.11 文献标识码:A 文章编号:1003-9082(2014)02-0001-02

一、引言

随着计算机的发展,当今用户对应用软件不再仅仅满足于功能的完善,而且对用户界面友好性、美观性要求越来越高。所以,以往的桌面应用程序开发并不能满足这些界面开发要求,这就致使越来越多的界面库的涌现,而现今的界面库大都基于DirectUI的设计思想[1],但由于原有窗体是规则的,所以根本无法实现异形窗体。随着微软分层窗体的设计思想及UpdateLayeredWindow函数的出现,异形窗体的实现才真正成为可能。但由于UpdateLayeredWindow本身的特性导致每次都必须全部重绘整个程序界面,所以即便是一个像素的改变,都将导致整个窗体的刷新,这对于CPU的占用是非常巨大的,尤其在大型软件中,这将是灾难性的。

本文在解析分层窗体和UpdateLayeredWindow的基础上,利用双界面合成的方法模拟实现异形界面的局部刷新,彻底解决了异形窗体的刷新问题,为DirectUI实现异形窗体扫除了一大障碍,为界面库的研究提供了新方法,新思路。

二、异形窗体与局部刷新技术

1.异形窗体简介

1.1分层窗体简介

在创建窗体时,拥有扩展属性WS_EX_LAYERED的窗体就是分层窗体了。通过分层窗体,我们可以实现异形、具有alpha值的窗体,另外还能为窗体实现动作,解决了以往的纯静态窗体的现实。对于分层窗体的绘图机制,可以有两种选择,其一是采用以往的WM_PAINT消息响应机制及局部刷新技术,但这种方法无法实现异形窗体。其二就是使用UpdateLayeredWindow函数,将绘图工作由系统托管,用户只需告诉系统需要绘制哪些图像;

1.2 UpdateLayeredWindow函数简介及现存问题

UpdateLayeredWindow函数是WIN32 API里功能非常强大的一个函数。通过在内存DC上作画,然后把该DC传递给UpdateLayeredWindow,系统就会托管后面的图像储存、压缩、渲染等工作,并且所有的绘图工作都由UpdateLayeredWindow来执行,也就是说你在内存DC上画了什么,就会显示出来什么[2]。

UpdateLayeredWindow改变了以往窗体绘制方式,由于每次绘图都要由UpdateLayeredWindow来操作,所以每次我们都要画出当前的整个应用程序界面,这就导致每次都要重新绘制整个窗体。这样就引起了我们引言中讲到的CPU占用高的问题。正是由于这个问题,当今的所有开源界面库全部都没有基于UpdateLayeredWindow来实现界面,当然也就无法实现异形,所以对于异形窗体,如何实现局部刷新是必须要解决的。

2.双界面合成方法模拟实现局部刷新

通过上节的讲解,全部刷新是由于UpdateLayeredWindow自身实现的问题,所以我们无法更改,所以我们只有采用模拟的方法来实现局部刷新。

如图一所示,原界面上有三个按钮控件,均为椭圆状,虚线框表示每个控件的大小,实际并不存在,这里要实现的效果是,当用户点击第一个控件时,将其改变成另一样式(菱形),双界面合成方法实现局部刷新的过程如下:

2.1首先,保存原界面;(步骤一)

众所周知,在WINDOWS程序中,绘图DC是与画布相关联的,只要我们的画布不销毁,界面就不会改变。所以,我们先保存上次的画布,为合成最新的画布做准备。

2.2创建一个临时画布,并在其上画出当前最新的控件样式及其背景;(步骤二)

2.4将最新绘制的控件及其背景根据更新区域大小进行裁剪;(步骤四)

2.5将裁剪后的图像与原图像抠图进行合成,形成最终的软件界面;(步骤五)

2.6将最终的软件界面传递给UpdateLayeredWindow显示出来即可;

三、结论

通过研究分层窗体,实现了局部刷新技术,解决了当前所有的界面库都无法创建异形的问题,另外在此基础上,在绘图时,可以使用GDI+绘画技术,而不会出现穿透性问题,同时解决了GDI+与异形窗体的融合性问题。当然对于界面库而言,兴起时间也不长,对于异形窗体的实现更是具有难度的,我相信对于异形窗体的研究会出现更多的成果,就要靠大家在实践中慢慢摸索了。

参考文献

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

摘 要:通过对现存界面库的分析,解释当前异形窗体的创建与刷新的难点,及刷新时CPU占用率高的问题,通过对updateLayeredwindow接口的深度剖析,阐述了利用双界面合成的方法来模拟局部刷新。采用先对局部窗体重绘,然后与原界面合成的方法,大量减小了刷新时的重绘量,从而大幅度减轻了CPU的占用率。

关键词:界面 异形窗体updateLayeredwindow 局部刷新

中图分类号:TP3011.11 文献标识码:A 文章编号:1003-9082(2014)02-0001-02

一、引言

随着计算机的发展,当今用户对应用软件不再仅仅满足于功能的完善,而且对用户界面友好性、美观性要求越来越高。所以,以往的桌面应用程序开发并不能满足这些界面开发要求,这就致使越来越多的界面库的涌现,而现今的界面库大都基于DirectUI的设计思想[1],但由于原有窗体是规则的,所以根本无法实现异形窗体。随着微软分层窗体的设计思想及UpdateLayeredWindow函数的出现,异形窗体的实现才真正成为可能。但由于UpdateLayeredWindow本身的特性导致每次都必须全部重绘整个程序界面,所以即便是一个像素的改变,都将导致整个窗体的刷新,这对于CPU的占用是非常巨大的,尤其在大型软件中,这将是灾难性的。

本文在解析分层窗体和UpdateLayeredWindow的基础上,利用双界面合成的方法模拟实现异形界面的局部刷新,彻底解决了异形窗体的刷新问题,为DirectUI实现异形窗体扫除了一大障碍,为界面库的研究提供了新方法,新思路。

二、异形窗体与局部刷新技术

1.异形窗体简介

1.1分层窗体简介

在创建窗体时,拥有扩展属性WS_EX_LAYERED的窗体就是分层窗体了。通过分层窗体,我们可以实现异形、具有alpha值的窗体,另外还能为窗体实现动作,解决了以往的纯静态窗体的现实。对于分层窗体的绘图机制,可以有两种选择,其一是采用以往的WM_PAINT消息响应机制及局部刷新技术,但这种方法无法实现异形窗体。其二就是使用UpdateLayeredWindow函数,将绘图工作由系统托管,用户只需告诉系统需要绘制哪些图像;

1.2 UpdateLayeredWindow函数简介及现存问题

UpdateLayeredWindow函数是WIN32 API里功能非常强大的一个函数。通过在内存DC上作画,然后把该DC传递给UpdateLayeredWindow,系统就会托管后面的图像储存、压缩、渲染等工作,并且所有的绘图工作都由UpdateLayeredWindow来执行,也就是说你在内存DC上画了什么,就会显示出来什么[2]。

UpdateLayeredWindow改变了以往窗体绘制方式,由于每次绘图都要由UpdateLayeredWindow来操作,所以每次我们都要画出当前的整个应用程序界面,这就导致每次都要重新绘制整个窗体。这样就引起了我们引言中讲到的CPU占用高的问题。正是由于这个问题,当今的所有开源界面库全部都没有基于UpdateLayeredWindow来实现界面,当然也就无法实现异形,所以对于异形窗体,如何实现局部刷新是必须要解决的。

2.双界面合成方法模拟实现局部刷新

通过上节的讲解,全部刷新是由于UpdateLayeredWindow自身实现的问题,所以我们无法更改,所以我们只有采用模拟的方法来实现局部刷新。

如图一所示,原界面上有三个按钮控件,均为椭圆状,虚线框表示每个控件的大小,实际并不存在,这里要实现的效果是,当用户点击第一个控件时,将其改变成另一样式(菱形),双界面合成方法实现局部刷新的过程如下:

2.1首先,保存原界面;(步骤一)

众所周知,在WINDOWS程序中,绘图DC是与画布相关联的,只要我们的画布不销毁,界面就不会改变。所以,我们先保存上次的画布,为合成最新的画布做准备。

2.2创建一个临时画布,并在其上画出当前最新的控件样式及其背景;(步骤二)

2.4将最新绘制的控件及其背景根据更新区域大小进行裁剪;(步骤四)

2.5将裁剪后的图像与原图像抠图进行合成,形成最终的软件界面;(步骤五)

2.6将最终的软件界面传递给UpdateLayeredWindow显示出来即可;

三、结论

通过研究分层窗体,实现了局部刷新技术,解决了当前所有的界面库都无法创建异形的问题,另外在此基础上,在绘图时,可以使用GDI+绘画技术,而不会出现穿透性问题,同时解决了GDI+与异形窗体的融合性问题。当然对于界面库而言,兴起时间也不长,对于异形窗体的实现更是具有难度的,我相信对于异形窗体的研究会出现更多的成果,就要靠大家在实践中慢慢摸索了。

参考文献

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

摘 要:通过对现存界面库的分析,解释当前异形窗体的创建与刷新的难点,及刷新时CPU占用率高的问题,通过对updateLayeredwindow接口的深度剖析,阐述了利用双界面合成的方法来模拟局部刷新。采用先对局部窗体重绘,然后与原界面合成的方法,大量减小了刷新时的重绘量,从而大幅度减轻了CPU的占用率。

关键词:界面 异形窗体updateLayeredwindow 局部刷新

中图分类号:TP3011.11 文献标识码:A 文章编号:1003-9082(2014)02-0001-02

一、引言

随着计算机的发展,当今用户对应用软件不再仅仅满足于功能的完善,而且对用户界面友好性、美观性要求越来越高。所以,以往的桌面应用程序开发并不能满足这些界面开发要求,这就致使越来越多的界面库的涌现,而现今的界面库大都基于DirectUI的设计思想[1],但由于原有窗体是规则的,所以根本无法实现异形窗体。随着微软分层窗体的设计思想及UpdateLayeredWindow函数的出现,异形窗体的实现才真正成为可能。但由于UpdateLayeredWindow本身的特性导致每次都必须全部重绘整个程序界面,所以即便是一个像素的改变,都将导致整个窗体的刷新,这对于CPU的占用是非常巨大的,尤其在大型软件中,这将是灾难性的。

本文在解析分层窗体和UpdateLayeredWindow的基础上,利用双界面合成的方法模拟实现异形界面的局部刷新,彻底解决了异形窗体的刷新问题,为DirectUI实现异形窗体扫除了一大障碍,为界面库的研究提供了新方法,新思路。

二、异形窗体与局部刷新技术

1.异形窗体简介

1.1分层窗体简介

在创建窗体时,拥有扩展属性WS_EX_LAYERED的窗体就是分层窗体了。通过分层窗体,我们可以实现异形、具有alpha值的窗体,另外还能为窗体实现动作,解决了以往的纯静态窗体的现实。对于分层窗体的绘图机制,可以有两种选择,其一是采用以往的WM_PAINT消息响应机制及局部刷新技术,但这种方法无法实现异形窗体。其二就是使用UpdateLayeredWindow函数,将绘图工作由系统托管,用户只需告诉系统需要绘制哪些图像;

1.2 UpdateLayeredWindow函数简介及现存问题

UpdateLayeredWindow函数是WIN32 API里功能非常强大的一个函数。通过在内存DC上作画,然后把该DC传递给UpdateLayeredWindow,系统就会托管后面的图像储存、压缩、渲染等工作,并且所有的绘图工作都由UpdateLayeredWindow来执行,也就是说你在内存DC上画了什么,就会显示出来什么[2]。

UpdateLayeredWindow改变了以往窗体绘制方式,由于每次绘图都要由UpdateLayeredWindow来操作,所以每次我们都要画出当前的整个应用程序界面,这就导致每次都要重新绘制整个窗体。这样就引起了我们引言中讲到的CPU占用高的问题。正是由于这个问题,当今的所有开源界面库全部都没有基于UpdateLayeredWindow来实现界面,当然也就无法实现异形,所以对于异形窗体,如何实现局部刷新是必须要解决的。

2.双界面合成方法模拟实现局部刷新

通过上节的讲解,全部刷新是由于UpdateLayeredWindow自身实现的问题,所以我们无法更改,所以我们只有采用模拟的方法来实现局部刷新。

如图一所示,原界面上有三个按钮控件,均为椭圆状,虚线框表示每个控件的大小,实际并不存在,这里要实现的效果是,当用户点击第一个控件时,将其改变成另一样式(菱形),双界面合成方法实现局部刷新的过程如下:

2.1首先,保存原界面;(步骤一)

众所周知,在WINDOWS程序中,绘图DC是与画布相关联的,只要我们的画布不销毁,界面就不会改变。所以,我们先保存上次的画布,为合成最新的画布做准备。

2.2创建一个临时画布,并在其上画出当前最新的控件样式及其背景;(步骤二)

2.4将最新绘制的控件及其背景根据更新区域大小进行裁剪;(步骤四)

2.5将裁剪后的图像与原图像抠图进行合成,形成最终的软件界面;(步骤五)

2.6将最终的软件界面传递给UpdateLayeredWindow显示出来即可;

三、结论

通过研究分层窗体,实现了局部刷新技术,解决了当前所有的界面库都无法创建异形的问题,另外在此基础上,在绘图时,可以使用GDI+绘画技术,而不会出现穿透性问题,同时解决了GDI+与异形窗体的融合性问题。当然对于界面库而言,兴起时间也不长,对于异形窗体的实现更是具有难度的,我相信对于异形窗体的研究会出现更多的成果,就要靠大家在实践中慢慢摸索了。

参考文献

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

猜你喜欢

窗体画布异形
商业模式画布
为什么要在画布上割一刀?
试谈Access 2007数据库在林业档案管理中的应用
让鲜花在画布上盛开
一种异形平衡梁设计与应用
水晶异形卡可以定制的交通卡
水晶异形卡可以定制的交通卡
水晶异形卡 可以定制的交通卡
大师的画布
数组矩阵虚拟窗体算法在自动分拣系统设计中的应用