有哪位大师帮下忙,帮改下代码。或给个类似的例子参考参考。
这代码是用透明贴图实现蝴蝶在可变的背景里循环飞行,背景框用picturebox。
我想在循环飞行的同时加多一个能控制蝴蝶飞远飞近的功能功能(类似图像缩放产生远近的效果),最好用上下键控制。
'“动画_透明处理”的窗体模块
Option Explicit
Dim ImageNo As Integer      '当前的位图编号
Dim IsPlaying0 As Boolean    '动画是否启动
Dim lngP As Long
Dim lngR As Long
Private Sub Form_Load()
ImageNo = 1   '动画从book1.bmp开始
IsPlaying0 = False           '开始时,动画未启动
'鼠标移到书上时,将出现“开始”提示
    Timer1.Interval = 400
    picFly.ScaleMode = 3                                             '象素
    picFly.Picture = LoadPicture(App.Path & "\原野.bmp")
    picSour1.AutoRedraw = True: picMask1.AutoRedraw = True
    picSour2.AutoRedraw = True: picMask2.AutoRedraw = True
    picSour1.Picture = LoadPicture(App.Path & "\Bfly1_Sour.bmp")
    picMask1.Picture = LoadPicture(App.Path & "\Bfly1_Mask.bmp")
    picSour2.Picture = LoadPicture(App.Path & "\Bfly2_Sour.bmp")
    picMask2.Picture = LoadPicture(App.Path & "\Bfly2_Mask.bmp")
'播放声音
'SND_ASYNC:异步演播,在播放声音时可以作其他的事
'SND_LOOP:循环演播,播完后再重播。需与SND_ASYNC组合使用
    sndPlaySound App.Path & "\wav300.wav", SND_ASYNC Or SND_LOOP
End Sub
'半秒钟系统自动引发Timer事件
Private Sub Timer1_Timer()
'声明计数器intC为整型的静态变量
    Static intC As Integer
'lngX和lngY表示在原野上飞舞的蝴蝶的位置
    Static lngX As Long
    Static lngY As Long
'intC的初值为0
    intC = intC + 1
'intC只有1和2两种取值
    If intC = 3 Then intC = 1
'intC=1显示张开的蝴蝶
'intC=2显示闭和的蝴蝶
    lngX = lngX + 8     '10是X方向的增量,以象素为单位
    lngY = lngY + 5        '5是Y方向的增量,以象素为单位
    If lngX > (picFly.Width - 40) Then
        lngX = 0
        lngY = 0
    End If
    If intC = 1 Then
        picFly.Cls          '清除蝴蝶飞舞所在的图片框
'对张开蝴蝶的透明处理
        lngP = BitBlt(picFly.hDC, lngX, lngY, _
            picMask1.Width, picMask1.Height, picMask1.hDC, 0, 0, SRCAND)
        lngP = BitBlt(picFly.hDC, lngX, lngY, _
            picSour1.Width, picSour1.Height, picSour1.hDC, 0, 0, SRCINVERT)
    Else
        picFly.Cls          '清除蝴蝶飞舞所在的图片框
'对闭合蝴蝶的透明处理
        lngP = BitBlt(picFly.hDC, lngX, lngY, _
            picMask2.Width, picMask2.Height, picMask2.hDC, 0, 0, SRCAND)
        lngP = BitBlt(picFly.hDC, lngX, lngY, _
            picSour2.Width, picSour2.Height, picSour2.hDC, 0, 0, SRCINVERT)
    End If
End Sub
Private Sub Timer2_Timer()
ImageNo = ImageNo + 1   '动画下一帧
If ImageNo > 4 Then    '如果动画已到最后一帧,则
    ImageNo = 1            '再从第一帧开始
End If
'在Image对象中显示动画的当前帧
picFly.Picture = LoadPicture(App.Path & "\head\head" & ImageNo & ".bmp")
End Sub

解决方案 »

  1.   

    把 蝴蝶 显示在另一个窗口中,无边框。
    用 API 设置窗体 KeyColor 透明。
      

  2.   

    背景框picturebox可以透明处理(仅供参考):http://topic.csdn.net/u/20091110/13/8ce6f8c1-cc47-4247-be7a-e35823a6681a.html?seed=62847887&r=61070709#r_61070709
      

  3.   

    任选一种颜色作为 KeyColor 。
    每一帧 蝴蝶 图片上需要透明的地方用这个颜色来填充。
    把画蝴蝶的窗体背景色也设置成这种颜色。选颜色很容易吧,共有 16777216 种颜色可选,你的蝴蝶不可能把这所有颜色都用完吧!窗体设置 KeyColor透明 用到的 API :GetWindowLong()
    SetWindowLong()
    SetLayeredWindowAttributes()先更改蝴蝶窗口的 GWL_EXSTYLE 属性:在原属性上增加 &H80000 属性
    然后用:
    SetLayeredWindowAttributes hWnd, KeyColor, 0, 1
    设置蝴蝶窗口的透明色。有在 Picture 上画的代码,在窗体上画也是一回事。
    只在把蝴蝶窗体置于背景窗体前就行了。