各位大虾,小弟请教一个透明控件的问题:
我想在窗体上怎样实现的控件透空,怎么实现?
我的窗口上有图片,自己写的控件上也有图片,当把控件加载到窗体上的时候 可以透明的看到下面的图片,而不是完全遮盖住下面窗体上的图片! 不知道怎么做,各位大虾能否提供点建议,或者有源码,小弟将感激不尽!
我想在窗体上怎样实现的控件透空,怎么实现?
我的窗口上有图片,自己写的控件上也有图片,当把控件加载到窗体上的时候 可以透明的看到下面的图片,而不是完全遮盖住下面窗体上的图片! 不知道怎么做,各位大虾能否提供点建议,或者有源码,小弟将感激不尽!
在窗体上是很好用的
至于在控件中,我还没有试呢
我想应该可以的!
另外,我这里可以把相关的东西,写给所有能看到这个帖子的人!
AlphaBlend 函数功能:该函数用来显示透明或半透明像素的位图。 函数原型:AlphaBlend(HDC hdcDest, int nXOriginDest, int YoriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BLENDFUNCTION blendFunction); 参数:
hdcDest:指向目标设备环境的句柄。
nXOriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
nYOriginDest:指定目标矩形区域克上角的Y轴会标,按逻辑单位。
nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
hHeightDest:指向目标矩形区高度的句柄,按逻辑单位。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
nWidthSrc:指定源矩形区的宽度,按逻辑单位。
nHeightSrc:指定源矩形区域 的高度,按逻辑单位。
blendFunction:每时定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。 返回值:如果函数执行成功,那么返回值为TRUE,如果函数执行失败,那么回值为FALSE。Windows NT:若想获取更多错误信息,请调用GetLastError函数。 备注:如果源矩形区域目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标将使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位的色彩格式不相同,那么AlphaBlend将源位图转换以匹配目标位图。
AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。 速查:Windows NT:5.0级以上版本;Windows:98级以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:作为一个资源包含在msimg32.dll中。
为了版权之鉴,我把原作和出处都附带!利用api函数实现图像淡入淡出效果
TechnoFantasy 原作
一般传统的实现两个picturebox之间图像的淡入淡出效果都需要使用大量的api函数并进行复杂的调色板以及
绘图设备(device context)的操作。但是在win98、win2000中,微软提供了支持透明图像拷贝的alphablend函数。
这篇文章就介绍如何通过api函数alphablend实现picturebox之间图像的淡入淡出效果。alphablend函数的定义在
msimg32.dll中,一般win98、win2000都带了这个库,在编程之前你可以先察看一下该文件是否存在。
打开vb建立一个新工程。选择菜单 project | add module 添加一个模块到工程中,在其中输入以下代码:
public type rblendprops
tblendop as byte
tblendoptions as byte
tblendamount as byte
talphatype as byte
end type
public declare function alphablend lib "msimg32" (byval hdestdc as long, _
byval x as long, byval y as long, byval nwidth as long, _
byval nheight as long, byval hsrcdc as long, _
byval xsrc as long, byval ysrc as long, byval widthsrc as long, _
byval heightsrc as long, byval blendfunct as long) as boolean
public declare sub copymemory lib "kernel32" alias "rtlmovememory" _
(destination as any, source as any, byval length as long)
大家可以看到,alphablend函数的定义同普通的复制函数bitblt很相似,只是最后的参数blendfunct定义为一个
rblendprops结构。那么为什么在函数定义中blendfunct 定义为long类型呢?因为rblendprops结构长度是4个字节。
而long类型变量的长度也是4个字节,那么我们就可以程序中通过api函数copymemory将一个rblendprops结构拷贝到
blendfunct 中。
在form1中添加两个picturebox控件,其中picture2为源,picture1为拷贝目标,将两者的scalemode都设置为3-pixel
将两者的autoredraw属性都设置为true,然后分别添加图像。在加入一个timer控件以及一个commandbutton控件,然后
在form1的代码窗口中添加如下代码:
dim ltime as byte
sub showtransparency(csrc as picturebox, cdest as picturebox, _
byval nlevel as byte)
dim lrprops as rblendprops
dim lnblendptr as long
cdest.cls
lrprops.tblendamount = nlevel
copymemory lnblendptr, lrprops, 4
with csrc
alphablend cdest.hdc, 0, 0, .scalewidth, .scaleheight, _
.hdc, 0, 0, .scalewidth, .scaleheight, lnblendptr
end with
cdest.refresh
end sub
private sub command1_click()
ltime = 0
timer1.interval = 100
timer1.enabled = true
end sub
private sub timer1_timer()
ltime = ltime + 1
showtransparency picture2, picture1, ltime
if ltime >= 255 then
timer1.enabled = false
end if
me.caption = str(int(ltime / 2.55)) + "%"
end sub
运行程序,点击command1,就可以看到picture2图像拷贝到picture1上的淡入淡出效果了。
在结构rblendprops中,最重要的参数就是tblendamount,该值决定了源与目标之间的透明程序。如果为0的话,源完全
透明,如果为255的话,源完全覆盖目标。
另外alphablend 函数不只用于两个picturebox之间的拷贝,而且可以在两个device context之间的透明拷贝,也就是
说,象窗口等控件之间也可以实现透明效果。不过在编程过程中发现一个问题,不知是否是alphablend的bug,就是在我写完
程序后,并没有出现透明复制的效果。搞的我以为该函数不起作用,但是当我再打开vb运行上面的程序后,一切有正常了。
我在msdn上也没有找到相关的bug列表。
www.applevb.com
实现两个图片可以互相替换!
渐变过程!模块中:Public Type rblendprops
tblendop As Byte
tblendoptions As Byte
tblendamount As Byte
talphatype As Byte
End Type
'Public Declare Function alphablend Lib "msimg32" (ByVal hdestdc As Long, _
ByVal x As Long, ByVal y As Long, ByVal nwidth As Long, _
ByVal nheight As Long, ByVal hsrcdc As Long, _
ByVal xsrc As Long, ByVal ysrc As Long, ByVal widthsrc As Long, _
ByVal heightsrc As Long, ByVal blendfunct As Long) As Boolean
Public Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, ByVal widthSrc As Long, _
ByVal heightSrc As Long, ByVal blendFunct As Long) As BooleanPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)窗体:
Dim ltime As Byte
Dim num As Integer
Dim Sign As Boolean
Sub showtransparency(csrc As PictureBox, cdest As PictureBox, _
ByVal nlevel As Byte)
Dim lrprops As rblendprops
Dim lnblendptr As Long
cdest.Cls
lrprops.tblendamount = nlevel
CopyMemory lnblendptr, lrprops, 4
With csrc
AlphaBlend cdest.hDC, 0, 0, .ScaleWidth, .ScaleHeight, _
.hDC, 0, 0, .ScaleWidth, .ScaleHeight, lnblendptr
End With
cdest.Refresh
End Sub
Private Sub command1_click()
ltime = 0
num = 1
Sign = False
Timer1.Interval = 50
Timer1.Enabled = True
End SubPrivate Sub Command2_Click()
End
End SubPrivate Sub Form_Load()
Picture1.Picture = LoadPicture(App.Path & "\4.jpg")
Picture2.Picture = LoadPicture(App.Path & "\3.jpg")
End SubPrivate Sub timer1_timer() ltime = ltime + num
If Sign = False Then
showtransparency Picture1, Picture2, ltime
ElseIf Sign = Not False Then
showtransparency Picture2, Picture1, ltime
End If
If Sign = False Then
Picture1.Visible = False
Picture2.Visible = True
Else
Picture1.Visible = True
Picture2.Visible = False
End If
If ltime >= 255 Or ltime <= 0 Then
Sign = Not Sign
num = -num
If Sign = False Then
Picture1.Visible = False
Picture2.Visible = True
Picture1.Picture = LoadPicture(App.Path & "\4.jpg")
Picture2.Picture = LoadPicture(App.Path & "\3.jpg")
Else
Picture1.Picture = LoadPicture(App.Path & "\3.jpg")
Picture2.Picture = LoadPicture(App.Path & "\4.jpg")
End If
End If
Me.Caption = "透明度:" & Str(Int(ltime / 2.55)) + "%"
End Sub
,并且 BackStyle=0
Declare Function BitBlt Lib "gdi32" ( _ ByVal hDestDC As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As RasterOps _ ) As Long Public Enum RasterOps
' Copies the source bitmap to destination bitmap
SRCCOPY = &HCC0020 '
' Combines pixels of the destination with source bitmap using the Boolean AND operator.
SRCAND = &H8800C6 '
' Combines pixels of the destination with source bitmap using the Boolean XOR operator.
SRCINVERT = &H660046 '
' Combines pixels of the destination with source bitmap using the Boolean OR operator.
SRCPAINT = &HEE0086 '
' Inverts the destination bitmap and then combines the results with the source bitmap
' using the Boolean AND operator.
SRCERASE = &H4400328 '
' Turns all output white.
WHITENESS = &HFF0062 '
' Turn output black.
BLACKNESS = &H42
End Enum
透明使用 SRCCOPY 参数,半透明使用 SRCINVERT。