欢迎来到天天文库
浏览记录
ID:57014771
大小:51.00 KB
页数:4页
时间:2020-07-30
《Win2000下编程实现窗体透明特效.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、摘要:本文主要介绍了Windows2000下新增的API函数SetLayeredWindowAttributes()以及通过该函数实现窗体透明特效的一般方法,并结合代码给出了具体的编程实现过程。 关键字:窗体特效;分层窗口引言 Windows2000操作系统无论是在品质上还是在用户界面上都有了很大的改善与提高,用户对系统的操作变的更加简单、方便,感觉也更加舒适。如果用户在使用时留意一下,不难发现其中界面上的一些新特性。例如,Windows2000提供了对带阴影阿尔法混合光标的支持、提供对菜单、提示框淡入淡出效果的支持以
2、及在外壳拖拽具有阿尔法混合效果图片等透明特效。所有这些特效看似不同但实际都是通过对Windows2000新提供的一个分层窗口API函数的调用而实现的。既然是Windows2000系统提供的API函数,那么也就意味着在自己的应用程序中同样能够实现该函数做做支持的各种特效。 在程序设计时,有时一些微小的改善就足以增强用户界面的显示效果。例如,使用一个具有阿尔法混合效果的光标显然要比一只普通光标的感觉要好的多,尤其是在大屏幕显示器或多显示器系统下这种光标也更容易找到。更进一步,显示器的屏幕大小是有限的,如果想同时查看多个窗口的
3、内容显然是不太方便的,尽管采取大屏幕显示器或多显示器系统能在一定程度上缓解但远不如将这些应用程序窗体设置为透明或半透明来的彻底和方便。下图显示的两个应用程序虽然存在覆盖,但位于前台的程序窗体显然没有影响后台Word文档内容的显示。鉴于分层窗口函数在程序设计中的实用作用,本文将对其作具体的介绍以充分挖掘其潜力并将其应用到程序设计中去。 分层窗口 在介绍分层窗口函数之前,首先要介绍一下WS_EX_LAYERED扩展窗口风格。该窗口风格也是Windows2000新增加的,如果使用了该属性,窗体将具备复合形状、动画、阿尔法混
4、合等方面的视觉特效。 窗口通过被其他窗口的裁剪而在屏幕上以矩形出现。为了实现一个圆形窗体,仅仅简单绘制一个圆形窗体是不够的,这样的话系统还会把窗体按原矩形进行点击检测,而且位于该窗体下的窗口仍将被该窗体矩形所裁剪。或许可以考虑在园形窗体显示出来前取得位于该窗体矩形下可视区域的快照,并在稍后窗体显示完毕后将其绘制到当前窗体。但由于其他窗口能够绘制该窗体覆盖下的区域,而前台程序无法获知这种绘制将于何时发生而不会及时获取下面可视区域的新的快照,因此这种解决方法并不能在多进程、多任务环境下很正常的工作。对于这种情况,在Windo
5、ws95/98和WindowsNT4.0下的正确做法是通过SetWindowRgn()API函数指出需要的窗体形状,但是这种处理在频繁更改窗体形状或是在屏幕上拖拽时仍有缺陷存在:前台窗体将要求位于其下的窗体重绘整个区域,这将生过多的消息和计算量。而且使用SetWindowRgn()只能实现窗体的全透明而无法实现半透明效果。或许这也正是分层窗口被提出的原因。 分层窗口真正实现了两个截然不同的概念:分层和重定向。为了能够去除任何一个层,WS_EX_LAYERED标志位必须要设置,这可以在窗体创建时设置也可以在创建后通过以GW
6、L_EXSTYLE标志调用SetWindowLong()来进行设置。接下来,可以通过UpdateLayeredWindows()函数来更新分层窗口。在具体使用时,需要在位图中绘制出可视区域,并将其与关键色、阿尔法混合参数等一起提供给UpdateLayeredWindows()函数。需要注意的是,在使用UpdateLayeredWindows()函数时,应用程序并不需要响应WM_PAINT或其他绘制消息。 除此之外,还可以使用传统的Win32绘制机制来实现,这需要调用另一个API函数SetLayeredWindowAttr
7、ibutes()来完成对关键色或阿尔法混合参数值的设定。一旦该函数被调用,系统将开始为分层窗口重定向所有的绘制并自动应用指定的特效。窗体半透明特效的实现 前面已经对分层窗口做了较为详细的介绍。这里将对SetLayeredWindowAttributes()函数及其使用方法做具体的介绍,并在此基础上实现窗体半透明特效。首先给出SetLayeredWindowAttributes()的函数原形:BOOLSetLayeredWindowAttributes(HWNDhwnd,//handletothelayeredwindow
8、COLORREFcrKey,//specifiesthecolorkeyBYTEbAlpha,//valuefortheblendfunctionDWORDdwFlags//action); 其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_AL
此文档下载收益归作者所有