上回说到要创建一个毫不规则的窗体是否要画n个图形来拼呢? 这是不可行的,人会疯的.既然画图形不行,那么我们反过来想, 把不想要的图形挖掉不就ok了,这就是所谓的逆向思维了. api中挖图的方法有很多,比如bitblt函数等.本课重点要介绍的是 etLayeredWindowAttributes函数,有点眼熟把?我在玻璃窗体一贴中 就用到 了他.有人问了,它不是使窗体透明的马?对,但这只是其一,他的 另一个功能就是挖图.这个函数要2000以后的版本才有,呵呵,应该没人还 用98了吧. 下面开始详细解说: 首先看函数名,跟setwindow是不是很像阿,对,只不过它是设置层窗口的属性. 什么是层窗口呢? 在2000以前,Windows系统为了减少刷新时的数据量,采用了剪裁窗口无效区机制 也就是说,当某个窗口处于了下层窗口上面时,对于下层窗口被覆盖的区域就会被自 动剪裁掉,在此区域上的绘图操作都立即返回 到了Windows2000,microsoft也认识到透明窗口的重要性,所以提出分层窗口 之所以叫分层窗口,这因为这种窗口中的图像是位于一个单独的内存位图中的 当屏幕刷新时,Windows系统负责在桌面图像上叠加分层窗口图像,并将合并结果送往 显存.不明白没关系,别管他. 函数声明如下: Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 参数: hwnd 不用说了吧 crKey 色彩关键值 bAlpha 用来设置混合功能,就是透明度了,取值0-255 ,0为完全透明. dwFlags 控制方式,此参数有两个值,LWA_COLORKEY和LWA_ALPHA. 当取LWA_COLORKEY时,第二个参数crKey才有效, 当取LWA_ALPHA时,第三个参数bAlpha才有效, 要是两个值都有效,就设成LWA_COLORKEY Or LWA_ALPHA. 挖图方法: 你可以直接指定crkey的值,在vb 里如果不知道颜色值可以用getpixel获取 图片上某个像素的RGB值,在vba里比较麻烦,因为窗体里的控件都没有句柄了。 所以还是直接指定的好,在属性里你 可以看到颜色的后面都有一个十六进制的数。 那就是他的值了。 在使用此函数前,要先用GetWindowLong获取窗体的扩展样式, GetWindowLong(hwnd, GWL_EXSTYLE) ,GWL_EXSTYLE就是扩展样式 然后用SetWindowLong将窗体设成分层样式,才能用。 最后要去掉窗体的标题和边框,直接在窗体内部画个矩形就ok。 下面是效果图:
9DDWHyUR.rar
(14.42 KB, 下载次数: 539)
|