VB PaintPicture (第2篇)

VB PaintPicture (第2篇)

如果看本篇不太懂的话,请先看第一篇

先把函数参数表放在这里

对象.PaintPicture picture,x1,y1,[width1],[height1],[x2],[y2],[width2],[height2],[opcode]

1.简单的图片的进入效果

实现 图片从左到右进入 的效果,需要怎么做呢

很简单可以想到用paintpicture 函数 比如 每隔0.1秒让图片向右移动一点,嗯,大概就是这个思路

先给出利用API的延时函数的代码

Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Sub delay(ByVal n As Single)
    Dim tm1 As Long, tm2 As Long
    tm1 = timeGetTime
    Do
        tm2 = timeGetTime
        If (tm2 - tm1) / 1000 > n Then Exit Do
        DoEvents '转让控制权,令程序在忙于执行指令时抽出少许时间让给别的程序
    Loop 
End Sub

博主画了一下picturebox的坐标系
坐标系

零点在左上角,width向右为正,height向下为正

我们拿下面这张图片做例子
适应窗口

我们拿这张图片做例子,左边pic1中加载了图片,我们要在pic2中实现从左向右进入效果,首先为了使图片大小适应窗口,代码如下

pic2.PaintPicture pic1.Picture, 0, 0, pic2.ScaleWidth, pic2.ScaleHeight, 0, 0, pic1.ScaleWidth, pic1.ScaleHeight

为了实现从左向右进入,pic2初始状态应该是这样子的,黑色表示pic2,红色表示图片
这里写图片描述

(x1,y1)需要水平右移,即x1增大,y1不变,由上面坐标系的分析可知x1是从-pic2.scalewidth 移动到0

我们每0.00005秒移动20个像素长度的话,代码如下

pic2.Cls
For i = -pic2.ScaleWidth To 0 Step 20
    pic2.PaintPicture pic1.Picture, i, 0, pic2.ScaleWidth, pic2.ScaleHeight, 0, 0, pic1.ScaleWidth, pic1.ScaleHeight
    delay 0.00005
Next i

这样图片就可以实现从左向右进入的效果
从左向右进入

从右向左与上面类似。

下面说从左上角斜向下
这里写图片描述

分析图得知,x1,y1都需要不断增大.我们用x1来做循环条件的话,y1的位置可以按比例计算得到。代码为

pic2.Cls
Dim id As Single '比例
Dim j As Single
For i = -pic2.ScaleWidth To 0 Step 20
    id = i / pic2.ScaleWidth 
    j = id * pic2.ScaleHeight
    pic2.PaintPicture pic1.Picture, i, j, pic2.ScaleWidth, pic2.ScaleHeight, 0, 0, pic1.ScaleWidth, pic1.ScaleHeight
    delay 0.00005
Next i

效果如图
这里写图片描述

下面我们再看一下右上角斜向下
右上角斜向下分析图
这里写图片描述
这里,x1要不断减小,y1要不断增大
所以代码为

pic2.Cls
Dim id As Single '比例
Dim j As Single
For i = pic2.ScaleWidth To 0 Step -20
    id = i / pic2.ScaleWidth 
    j = -id * pic2.ScaleHeight ' i 是减小,j是增大
    pic2.PaintPicture pic1.Picture, i, j, pic2.ScaleWidth, pic2.ScaleHeight, 0, 0, pic1.ScaleWidth, pic1.ScaleHeight
    delay 0.00005
Next i

其他的平移进入型方法都一样,明确了坐标系以后就好办了

2.百叶窗效果

拿水平百叶窗为例,效果图如下

这里写图片描述

我们需要把整个图片height切割,切成多个横条(假设数量为pages),如果每个横条的height为sy,则我们需要用2层循环来实现水平百叶窗效果。

外层循环为0到sy的循环,内层循环为1到pages的循环;外层规定了每个横条画出的高度,内层是使所有的横条都先画出规定的高度。

代码如下

pic2.Cls
Dim pages As Integer
pages = 20   '切成20个横条
Dim sy As Single   '每个横条的高度
sy = pic1.ScaleHeight / pages
Dim gao, id As Single  'gao表示当前每个横条画出来的高度,id是比例
id = pic2.ScaleHeight / pic1.ScaleHeight
For gao = 20 To sy + 10 Step 2
    For i = 0 To pages - 1
        pic2.PaintPicture pic1.Picture, 0, sy * i * id, pic2.ScaleWidth, gao * id, 0, sy * i, pic1.ScaleWidth, gao
    Next i
    delay 0.00002
Next gao

这里注意外层循环如果从0到sy的话会出错,从20到sy的话最后可能整个图片会留一条白线,所以这里选择了从20到sy+10,step可以调节百叶窗闭合的速度

竖直百叶窗与水平类似,给出代码

pic2.Cls
Dim pages As Integer
pages = 40  '切成40个纵条
Dim sx As Single '每个纵条的宽度
sx = pic1.ScaleWidth / pages

Dim kuan, id As Single 'kuan表示当前每个纵条画出来的宽度
id = pic2.ScaleWidth / pic1.ScaleWidth
For kuan = 20 To sx + 5 Step 2
    For i = 0 To pages - 1
        pic2.PaintPicture pic1.Picture, sx * i * id, 0, kuan * id, pic2.ScaleHeight, sx * i, 0, kuan, pic1.ScaleHeight
    Next i
    delay 0.00002
Next kuan

这里写图片描述

结束

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

Fanstorm丶

若有相助,可打赏一杯奶茶哦~

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值