APP下载

一种简单窗口半透明方法的研究与实现

2016-03-10冯伟桓

关键词:控件

冯伟桓, 钱 欢

(1.成都理工大学 数学地质四川省重点实验室, 四川 成都 610059;

2.中南大学 数学与统计学院, 湖南 长沙 410083)



一种简单窗口半透明方法的研究与实现

冯伟桓1, 钱欢2

(1.成都理工大学 数学地质四川省重点实验室, 四川 成都610059;

2.中南大学 数学与统计学院, 湖南 长沙410083)

摘要:目前窗口半透明的应用越来越广泛,越来越多的窗口呈现出风格迥异的界面设计,如此别具一格的设计,提高了用户的体验.基于WPF实现了一种较为简单的窗口半透明方法,详细介绍了实现窗口半透明的原理和流程,提出并实现了窗口半透明且控件不透明的方法.算法运行结果表明,该方法效率较高、实现简单.

关键词:窗口半透明;WPF;控件

0引言

早期的计算机操作系统中,窗口作为应用程序和用户沟通的界面,往往是不透明的,即一个窗口被其他窗口覆盖的部分完全不可见,这在一定程度上限制了用户的视野和操作,并且一成不变的窗口虽然使得整个窗口系统风格统一,但同时也使用户更容易产生审美疲劳,降低了用户的体验.目前,主流的计算机操作系统都在积极引入窗口半透明机制,比如,苹果公司推出的MAC OS X首次以备份缓冲和OpenGL硬件加速技术实现了在系统层次上的窗口半透明.此外,虽然Unix和类Unix操作系统的窗口还没有实现半透明,但其开发人员正在对它增加一些窗口半透明的扩展,然而效率很低,并且速度很慢.而由微软推出的Windows Vista和Windows 7系统可以通过开启Aero特效实现系统层次上的窗口边框半透明,最新的Windows 8和Windows 10操作系统,已经引入了窗口半透明机制.可见,半透明是窗口系统未来的发展趋势之一.本研究主要讨论一种较为简单且高效的实现窗口半透明方法——基于WPF[1-5]的窗口半透明实现.

1窗口半透明实现方案

1.1基于备份缓冲的窗口半透明实现

备份缓冲是现有的窗口半透明方法之一,其主要思路是为每个窗口增加一个α属性,用于指示每个窗口的不透明度,在窗口更新和显示前,获得窗口即将遮挡部分的内容,并保存在内存中备份,然后在窗口显示的时候,先显示在内存中保存好的内容备份,再将待显示的窗口内容乘以α属性后显示在窗口上,就可以实现窗口半透明效果.

备份缓冲这种方法虽然可以较好地实现窗口半透明,但这种方法需要在窗口更新和显示前实时更新备份窗口即将遮挡的内容,因此会消耗大量的资源,并且效率比较低.虽然备份缓冲可以结合OpenGL硬件加速技术来提高效率,降低消耗的资源,但这样会使得算法复杂度大大增加.

1.2基于WPF的窗口半透明实现

1.2.1WPF简介.

WPF(Windows Presentation Foundation)是微软推出全新的用户界面框架,由.NET Framework 3.0引入,旨在为应用程序的编写提供统一的编程语言、模型和框架,用于实现能带给用户震撼视觉体验的Windows客户端应用程序.

WPF的界面设计用的是基于XML语法的XAML语言,而应用程序后台逻辑的开发大多用的都是C#.界面设计人员可以通过微软提供的Expression Blend工具或直接手写XAML文件的方式开发和设计应用程序的界面,而开发人员则可以更加关心应用程序的后台逻辑,真正做到了区分界面设计人员与开发人员的工作.

1.2.2实现原理.

WPF中所有的用户界面元素,都被称为控件.控件从用途上可以分为4种:内容控件(Content Controls)、条目控件(Items Controls)、文本控件(Text Controls)和范围控件(Range Controls).

窗口在WPF中以Window控件的形式存在.根据窗口的特性,可以确定Window控件是属于内容控件,即Window控件继承自ContentControl并且具有重要的Content属性.ControlControl是继承自Control类的,因此Window控件具有继承而来的Opacity属性.

Opacity属性是在Control类中定义的,用于控制控件的不透明度,可以在0到1之间取值,0表示完全透明,1表示完全不透明.Window控件具有Opacity属性,可以利用该属性实现窗口半透明.

1.2.3实现流程.

通过Opactiy属性可以使控件呈现出半透明.但窗口Window控件作为一种特殊的控件,仅仅设置Opacity属性,是远远不够的,图1展示了仅仅将Opacity属性设置为0的情况.

图1将Window控件Opacity属性设置为0时的窗口

如图1所示,仅仅将Window控件的Opacity属性设置为0时,整个窗口除边框以外都呈现为黑色.这是因为窗口样式默认包含了边框,而且默认的窗口是不支持透明的.

为了去除窗口边框,可以设置Window控件的WindowStyle属性.WindowStyle属性是枚举类型值,可以取的值有None、SingleBorderWindow、ThreeDBorderWindow和ToolWindow.其中,None表示窗口仅工作区可见,边框不会显示,正符合要求,所以为实现窗口半透明,还需要将Window控件的WindowStyle属性设置为None.图2展示了去除默认的窗口边框后的情况.

图2 将Window控件WindowStyle属性设置为None时的窗口

如图2所示,窗口虽然去掉了边框,默认的标题栏也不再显示,但并没有像预期一样,呈现出窗口半透明.这是因为窗口默认不支持半透明,只能通过修改Window控件的AllowsTransparency属性修改窗口默认行为.设置Opacity属性为0.5,使窗口实现半透明;设置WindowStyle属性为None,去除窗口默认边框;设置AllowsTransparency属性为True,使窗口支持半透明.最后实现的效果如图3所示.

图3最简单的半透明窗口

在图3中,窗口呈现出白色半透明,并且窗口中的控件也呈半透明显示,这是因为窗口默认的背景色是白色,窗口中的控件作为窗口的子控件会延续父控件的透明度.因此子控件的Opacity属性虽然依旧是默认值1,表示控件不透明,但却因为父控件的透明度,会作用到父控件的内容,即其子控件上,使子控件最终显示出与父控件相同的透明度.

因此,在窗口设置为半透明时,子控件会延续父控件的透明度,最终子控件也表现出半透明.这样的效果,称为全局透明,有时候也会需要这样的效果,例如,在Office Word中对选中字体提供快捷操作的窗口,即使用了全局透明的效果,具体如图4所示.但在大部分情况下使用全局透明效果,会使子控件看起来模糊不清.因此全局透明效果的应用十分有限.

图4Office Word全局透明效果应用实例

1.2.4一种较为完善的方法.

本研究提出一种较为完善的方法,实现窗口半透明,且控件不透明的界面效果.其实现流程如图5所示,效果如图6所示.

图5一种较为完善方法的实现流程

图6窗口半透明,控件不透明效果

按照上述实现流程,实际由一个和窗口一样大小的Border修饰控件来控制窗口的不透明度,从而实现窗口半透明,且控件不透明效果.该方法的关键代码如下:

当风送系统的风机转速在2000转/分,籽粒水分含量大于20%时,风道入口容易堵塞,需打开堵盖疏通,工作量较大,转速加大则出现嗑籽和撒籽现象。建议在收获前测定葵盘、籽粒含水率,选择籽粒水分含水率小于20%的地块进行收获。

〈Window x:Class=″TestWPF.MainWindow″

……

Background=″Transparent″

WindowStyle=″None″

AllowsTransparency=″True″〉

〈Grid〉

〈Border BorderBrush=″Black″

Background=″White″

CornerRadius=″5″

BorderThickness=″1″

Opacity=″0.8″/〉

〈Grid〉……〈Grid/〉

〈/Grid〉

〈/Window〉

1.3方法讨论

本研究提出方法的优点是,代码实现的时间复杂度和算法复杂度都比较低,并且显示效果较好.同时,基于WPF使该方法获得较好的可扩展性,可较为简单且高效地实现了窗口半透明效果.但该方法的缺点在于需要去除窗口自带的边框,而对于去除之后的窗口,将无法使用由系统层次提供的移动窗口、最小化窗口、最大化窗口、关闭窗口和动态改变窗口大小等功能.因此,要想实现功能完备的半透明窗口,还需要进一步手动编写后台逻辑代码实现这些由系统层次提供的功能.

2结论

窗口半透明相当于增加了电脑屏幕的空间,使用户能够看到更多的内容.本研究实现了一种简单、高效,且基于WPF来实现窗口系统半透明的方法.由于WPF的扩展性,使用该种方法创建的半透明窗口,具有很强的多样性.在一定条件下,稍微调整一个或者几个窗口控件的属性值,就可以得到花样繁多、风格迥异的窗口.

参考文献:

[1]MacDonald M.ProWPFinC# 2012:Windowspresentationfoundationin.NET4.5[M].New York,USA:Apress Media,2012.

[2]Sells C,Griffitbs I.ProgrammingWPF[M].California,USA:O'Reilly Media,Inc,2007.

[3]Eric White.GDI+程序设计[M].北京:清华大学出版社,2002.

[4]Adam Nathan.Windowspresentationfoundationunleashed[M].Carmel,Indiana:Sams Publishing,2006.

[5]琚彬.基于WPF平台的自定义控件开发[D].西安:西安电子科技大学,2008.

Research and Implementation of Simple Method for Semi-Transparent Window

FENGWeihuan1,QIANHuan2

(1.Geomathematics Key Laboratory of Sichuan Province, Chengdu University of Technology, Chengdu 610059, China;2.Mathematics and Statistics Academy, Central South University, Changsha 410083, China)

Abstract:Currently,the application of semi-transparent window has become more widely with more and more windows showing different styles of interface design.All those different designs draw more attention,and also improve the user experience.This paper does the research on semi-transparent windows and comes up with a simpler way to realize the translucency of the window.The paper also discusses the details of principles and processes to realize its translucency and puts forward a method to realize the translucency of windows and the opaque of controls.The final operating results show that this method is more efficient,and easy to be realized.

Key words:semi-transparent window;WPF;control

中图分类号:TP316

文献标志码:A

作者简介:冯伟桓(1991 — ), 男, 硕士研究生, 从事计算机3S软件技术研究.

收稿日期:2015-12-16.

文章编号:1004-5422(2016)01-0067-04

猜你喜欢

控件
基于C++Builder 的电子邮件接收程序设计*
使用“填表单”微信小程序 统计信息很方便
基于.net的用户定义验证控件的应用分析
关于.net控件数组的探讨
Excel深度考核自动阅卷系统中控件的评判方法
用Delphi编程实现H.264视频文件的播放
PowerBuilder中利用OLE技术实现H.264视频文件的播放
用VB扩展Authorware数据库应用能力的方法
基于VxWorks的人机界面图形开发系统设计
基于多级链表实现MiniGUI属性页控件设计