CSDN上不是有做透明效果的吗?找到它,设定一下透明值不就行了吗?
解决方案 »
- C定义函数DLL的调用转化为delphi的调用
- VF代码转Delphi中宏问题,急
- delphi6中如何使用fastreport,fastreport在哪里下载?
- QuickReport下为什么在ColumnHeaderBand中设置的QRLabel的标题显示不出来?
- 这段时期遇到的一些题...(FOR 高中信息技术竞赛)
- 会api的朋友可以进来吗
- 1stclass3000ProVcl6控件刚下的,但是没注册抹,请问那为朋友有??
- 我 想问一下,有没有人做过卡拉OK这套系统的
- 处理窗口消息方面的问题,帮忙看看,谢谢!
- 紧急求助:哪种加密方式可以使“0006-5B2F-92F4-Q187” 加密后仍然为“XXXX-XXXX-XXXX-XXXX”,最好有源码。谢谢啦
- 现在是该学delphi5还是应该学delphi6呢?
- 急-->如何在NT局域网环境内查找某个NT Server是否存在,也就是确定是否已经启动
------------------------------------------------------------------------------
利用API函数实现图像淡入淡出效果
一般传统的实现两个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 TypePublic 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) 大家可以看到,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 ByteSub 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 SubPrivate 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列表。
Private Const AC_SRC_OVER = &H0
Private Const AC_SRC_ALPHA = &H1
Private Const AC_SRC_NO_PREMULT_ALPHA = &H1
Private Const AC_SRC_NO_ALPHA = &H2
Private Const AC_DST_NO_PREMULT_ALPHA = &H10
Private Const AC_DST_NO_ALPHA = &H20
Private Const ULW_COLORKEY = &H1
Private Const ULW_ALPHA = &H2
Private Const ULW_OPAQUE = &H4Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_TRANSPARENT = &H20&
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明代码一:一个半透明窗体
Private Sub Form_Load()
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED 'or WS_EX_TRANSPARENT
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
End Sub代码二:形状不规则的窗体
Private Sub Form_Load()
Dim rtn As Long
BorderStyler=0
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, vbBlue, 0, LWA_COLORKEY '将扣去窗口中的蓝色
End Sub
http://www.csdn.net/expert/topic/97/97371.shtm
http://www.csdn.net/expert/topic/95/95344.shtm
希望对你有所帮助