虽然看的人不多,但是还是有人看 ,我就继续下去.(顺便庆祝今天换了个头,呵呵) 上回说道如何做局部透明的窗体,这是一个比较深的话题了. 要看懂本课的内容是需要一定的基础的,看不懂的也没关系,就当是开开眼界吧, 也见识一下API的强大. 上次讲了SetLayeredWindowAttributes这个函数,它的缺点就是不管三七二十一一概透明. 其实api里还有一个更强大的函数UpdateLayeredWindow,这个函数是通过用一副32位带Alpha 通道的位图来更新窗口,你可以精确的设定每一个象素的Alpha值(就是透明度),这样你想要哪里 透明就哪里透明.此函数的结构如下: UpdateLayeredWindow hwnd:HWND; // 窗口句柄 hdcDst:HDC; // 目标 DC ptDst:pPoint; // 目标的 TopLeft Size:pSize; // 显示 Size hdcSrc:HDC; // 源 DC ptSrc:pPoint; // 源 DC 的 TopLeft crKey:COLORREF; // 透明颜色值 Blend:pBlendFunction; // Alpha 混合函数 dwFlags:DWord // 一组标志位常量 DC:Device Context 设备描述表或设备上下文,是GDI内部保存数据的一种数据结构,此结构中的属性 内容与特定的输出设备(显示器,打印机等)相关. 什么是GDI?GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责 系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。是api的一个子集. 呵呵,要说的概念还真多.对于不熟的朋友来说一时也弄不明白.如果真的想学,可以看看有关的书籍. 否则了解一下就ok了. dc也有句柄就是hdc.最后一个参数blendFunction 是一个BLENDFUNCTION结构。 Private Type BLENDFUNCTION BlendOp As Byte BlendFlags As Byte SourceConstantAlpha As Byte AlphaFormat As Byte End Type BLENDFUNCTION结构控制源和目标位图的混合方式,它的BlendOp字段指明了源混合操作, 但只支持 AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。 OpenGL的alpha混合还支持其他的方式,如常量颜色源。下一个字段 BlendFalgs必须是0, 也是为以后的应用保留的。最后一个字段AlphaFormat有两个选择:0表示常量alpha值, AC_SRC_ALPHA表示每个像素有各自的alpha通道。 有个不幸的消息,在我将代码从vb移植到vba的时候失败了,几经调试未成功,好像是在动态 创建32位的位图时不行,我把代码放上来,希望有高手可以解决.在vb是没问题的,下面有一个 别人做的效果图;
GEtZYC2x.rar
(196.24 KB, 下载次数: 657)
最后,很遗憾的告诉你,UpdateLayeredWindow仍然有缺点,就是更新过的窗口上面的控件都看不见了。 但是还可以响应鼠标事件,看来要做局部透明的窗体真不容易啊。只有另寻他法了(等我学完《windows 图形编程》在说吧。) 预告:如果你认为以前各课都没有什么实用价值的话,那么下一课的内容将非常实用,敬请关注!
预告:如果你认为以前各课都没有什么实用价值的话,那么下一课的内容将非常实用,敬请关注!
[此贴子已经被作者于2007-1-23 13:17:59编辑过] |