- 帖子
- 130
- 积分
- 130
- 经验
- 130 点
- 威望
- 0 点
- 金钱
- 1146 NG
- 魅力
- 160
- 性别
- 男
- 注册时间
- 2003-3-1
我们约会吧!
|
1#
发表于 2003-3-1 09:48
| 只看该作者
【转帖】VB6.0中多媒体的编程技巧(一)
Web动画图像分解在VB动画设计中的应用
朋友,当你每次浏览Web网页时,是不是被许多生动有趣的小动画深深
吸引,十分佩服作者的想象力和制作技巧。在使用VB进行应用软件开发设计
中,为使软件的人机界面新颖友好,总想加点动画作点缀,但又常常苦于一
幅幅动画图片的绘制或寻找!因此萌发了一种奇妙的设想:能否让Web页面上
的动画在VB应用软件界面上活起来?幸运的是,当前图像处理软件甚多,终
于可以将您的这一设想变成现实。
1.VB动画设计
动画的制作原理很简单:首先绘制几幅相近但又有细微变化的图片,然
后每隔一段很短的时间就依次显示其中一幅,由于人眼视觉暂留,就能看到
连贯的动画效果。 使用VB进行动画设计非常方便,因为其工具箱中有图像、
图片、时钟控件。只要获得了一幅幅动画单幅图像文件,把它们放入图像控
制数组中去,便可用时钟控件的控制属性Interval来控制每幅图片的显示间
隔,把最终动画显示的位置确定好后,按时间间隔依次从图像控制数组中取
出一幅图显示。如此交替反复显示,即可产生动画效果,编程实现比较简单。
VB动画设计所能接收的单幅图片文件的格式有四种,即*.Bmp、*.Ico、
*.Wmf和*.Dib。其中*.Bmp文件的来源最广,不但可以使用Windows环境下
的各种绘图软件来绘制(但费时费力,且不是每个人都有绘画的天才),也可
以使用Windows所提供的现成的位图文件,或者用彩色扫描仪扫入等等。在
此,笔者所感兴趣的则是从Internet上Web站点网页上下载自己喜爱的动画
图像文件,再经过图形软件分解、处理成一幅幅*.Bmp图片文件,它们会给
软件的人机界面带来全新的感受。
2.Web动画图像分解方法
从Web网页上下载静态图像文件比较简单,下载后需要进行分解。 动画
图像文件的分解是动画设计的逆过程,即把一个动画效果的图像文件分解形
成它的多幅图片文件。可使用GIF Construction Set软件打开(此软件可在
许多服务器上下载)要分解的图像文件,该软件即可将动画自动分解为多幅
组成动画的单幅图画。 使用上述软件分解后,首先看看是由几幅图画组成
的动画,如果有N幅图画,就把动画文件拷贝N份。 然后,逐个打开拷贝文
件对每个文件进行处理,处理过程中只需在第一个文件中保留静止的图像,
在其它文件中只保留动画图像。 最后,使用具有图形转换功能的图形处理
软件如Phtoshop,就可把得到的N个*.Gif图像文件都转换成*.Bmp文件的格
式。Web动画分解过程概括描述如下: Web动画下载→Web动画分解(GIF
Construction Set)→Web动画格式转换(Phtoshop等)。
*一个实例*
这是一个在数据库查询窗体上设计的眼睛转动查看的动画,此动画的
每个单幅图画就是从Web网页上下载分解得到的。 动画设计实现步骤如下:
首先,用上述方法把Web网页上转眼睛动画下载保存、分解、格式转换成二
幅画Eyesl.Bmp和Eyes2.Bmp(此动画简单,只由二幅画组成)。 其次,将
Eyes1.Bmp和Eyes2.Bmp放入图像控制数组中。 窗体构造简单表示如下:
窗体属性表如下:
程序代码如下:
在窗体的General中声明:
Dim Rotateflag as Integer '交替显示标志
Dim Currenteyes as Integer '当前显示第几幅画
窗体装载初始化:
Sub Form_Load() Rotateflag=1 '进入显示(时钟计数开始)
Currenteyes=0 '第一幅画定位
End Sub
交替显示子程序(时钟控制显示间隔,本例为250ms):
Sub Tmrtimer_Timer()
If Rotateflag=1 Then '交替显示开始
SImgeyes.Picture=Imgeyes(Currenteyes).Picture '开始显示第一幅画
Currenteyes=Currenteyes+1 '250ms后显示下一幅
If Currenteyes=2 Then Currenteyes=0 '如果已显示了两幅,则再从第
一幅显示
End If
End If
End Sub '结束
利用Web网页动画图像分解成的多个单幅图画,不但可以为VB动画设计
提供方便,也可用于VC等动画编程。目前,Internet的范围日益扩大,使
Web与软件编程联系起来,无疑提高了应用软件的制作效率和质量。
3.巧用VB设计图像切换效果
PaintPicture是自VB4以后新提供的图形图像处理方法,它的基本功能
是图像块传输,在以前的VB版本中要产生块传输效果,需采用WindowsGDI中
的块传输函数BitBltAPI调用。PaintPicture正是VB中用来代替BitBltAPI
调用的简单而方便的方法。它能快速地将两幅位图进行合并;能将位图的全
部或某一部分快速剪切并粘贴到其它地方;并能将位图自动延伸或压缩以适
应新的环境;能在屏幕上不同位置之间、屏幕与内存之间传递位图;它采用
32位三元光栅操作代码(ROP),在源位图、选定的刷子位图和目标位图之
间进行颜色组合,生成目标位图中的最终颜色,它将13个常用的ROPR操作以
内部常量形式给出,不需任何声明,不用理会其32位参数值。
基本格式:
Object.PaintPicturepicture,x1,y1,width1,height1,x2,y2,
Width2,height2,opcode
其中Object可以为窗体或PictureBox控件Picture可以为BMP、Dib、Ico、
Wmf、Emf等格式的图片
X1、Y1、Width1、height1为目标位图的参数
X2、Y2、Width2、height2为源位图的参数
opcode表示源图与目标位图(或刷子位图)的组合关系,该参数与BitBlt
中dwRop参数含义相同。
VB4为opcode定义了13个内部常量:
vbDstInvert:目标位图取反
vbSrcCopy:源位图直接覆盖目标位图
vbSrcAnd:源位图与目标位图进行“与”操作
?bSrcInvert:源位图与目标位图进行“异或”操作
vbSrcPaint:源位图与目标位图进行“或”操作
vbNotSrcCopy:源位图取反
vbSrcErase:目标位图取反,再与源位图进行“与”操作
vbNotSrcErase:源位图与目标位图进行“或非”操作
vbMergePaint:源位图取反,再与目标位图进行“或”操作
此外,与刷子位图有关的常量是vbMergeCopy、vbPat?Copy、vbPat-
Invert和vbPatPaint,这13个内部常量可以在菜单View/ObjectBrowser/
VB-VisualBasicobjectsandproce?dures/RasterOpConstants中列出。
巧用PainPicture方法,结合控件属性,可以方便地产生许多常见的图像
切换效果,如我们在多媒体作品及电视中常见的图像旋转引入、翻转、飞入、
滑入、弹出、淡入淡出、隐现等动画效果。
举例:图像滑入(Wipe)效果的实现
在滑入效果中,新图像慢慢逐渐覆盖旧图像,就象在墙上展于一幅卷成筒
状的画。
1.缺省窗体Form1
2.Form1上置PictureBox1、PictureBox2两大小相同的图片控件及Timer
时钟控件PictureBox1中安装源图,在Pic?tureBox2中展开PictureBox1中的
图像。
3.编程
Private Sub FormμLoad()
Picture1.ScaleModeΚPixel
Picture2.ScaleModeΚPixe1
hΚ0
tΚ2
EndSUb
PrivateSubTimerμTimer()
IfhΙΚPicture1.ScaleHeightThen
Picture2.PaintPicturePicture1.Picture,0,h,Picture2.Scal-
eWidth,t,0,h,Picture1.ScaleWid
th,t,vbSrcCopy
hΚh+t
EndIf
EndSub
图像艺术清屏
随着Windows的普及,DOS下的清屏方式也应走向Windows艺术清
屏。本文向大家介绍在 Windows下,如何利用VB做图像拖拽,形成图
像艺术清屏效果。希望能再次抛砖引玉,在电脑爱好者天地中,出现
更好、更美的清屏方法。
一、准备工作
获取若干图形尺寸大小相同的BMP图形文件。推荐以下两种方法:
1?利用PHOTOSHOP或画笔裁剪出若干图形尺寸相同的BMP图形文
件存盘。
2?利用现有图像文件,通过3DS生成若干图形尺寸相同的BMP图
形文件。简明步骤如下:
(1)进入3DS中,将Render-Setup-Background文件名,设定成
现有图形文件名。
(2)在任意视图中,设定Render-View-Configure-文件类型256
色BMP非压缩类型、背景Recale、disk存盘,即可生成符合图形尺寸大
小的BMP图形文件存盘。
二、设计方法
1?放置控件
在窗体Form1中 ,建立两个PictureBox控件:
Form1.Picture1(0)和Form1.Picture1(1),设Form1.Picture1(1)在Form1.Picture1(0)之上,并使此两个控件的位置大小完全一样
Form1.Picture1(0).Left=Form1.Picture1(1).Left
Form1.Picture1(0).Top=Form1.Picture1(1).Top
Form1.Picture1(0).Width=Form1.Picture1(1).Width
Form1.Picture1(0).Height=Form1.Picture1(1).Height
且:Form1.Picture1(0).AutoRedraw=True
Form1.Picture1(0).AutoSize=False
Form1.Picture1(1).AutoRedraw=True
Form1.Picture1(1).AutoSize=False
2?图像艺术清屏实现原理
利用反复交替改变Form1?Picture1(1)的Width或Height的大小实现
图像的左右上下拖拽、卷起,达到图像清屏效果。可通过设置CommandButton
的事件代码实现(见CommandButton的Command1代码)。
通过循环控制上层图Form1.Picturc1(1)的Width或Height大小:
当其由小→大循环递增时,形成图像拖拽效果,当Width或Height达到
实际图像的宽度或高度,完全遮盖住下层图Form1.Picture1(0)时,对下层图Form1.Picture1(0)换图,改变Form1.Picture1(0)Picture属性。
当其由大→小循环递增时,形成上层图像卷起、下层图像拖拽的效果,
当Width或Height达到0,完全露出下层图Form1.Picture1(0)时,对上层图Form1.Picture1(1).Picture换图,改变Form1.Picture1(1).Picture属性。
三、VB实现图像艺术清屏程序部分关键代码
其中t1-t7.bmp均为320*200*256C分辨率的BMP文件。
Private Sub Form-Load()
Form1.Caption = ″电脑艺术趣味清屏″
′将两图形控件重合放置,Picture1(0)在下,Picure1(1)在上
′Picture1(0)完全被Picure1(1)遮住
Form1.Picture1(0).AutoRedraw = True
Form1.Picture1(0).AutoSize = False
Form1.Picture1(1).AutoRedraw = True
Form1.Picture1(1).AutoSize = False
Form1.Picture1(0).Left = Form1.Picture1(1).Left
Form1.Picture1(0).Top = Form1.Picture1(1).Top
Form1.Picture1(0).Width = Form1.Picture1(1).Width
Form1.Picture1(0).Height = Form1.Picture1(1).Height
EndSub
Private Sub Command1_Click()
′将图形文件装入Picture1控件Picture属性中,注意图wqje文件所在的路径
Form1.Picture1(0).Picture = LoadPicture(″e:\3ds4\images\t1.bmp″)
Form1.Picture1(1).Picture = LoadPicture(″e:\3ds4\images\t3.bmp″)
′记录下图像的宽度w1和高度h1
w1 = Form1.Picture1(1).Width
h1 = Form1.Picture1(1).Height
′Picture1(1).Picture由不可见状态,从左向右拉开形成图形清屏效果
Form1.Picture1(1).Height = h1
Form1.Picture1(1).Width = 0
For i = 0 To 50
Form1.Picture1(1).Width = i * w1 / 50
Next i
′当Picture1(1).Picture完全遮住Picture1(0).Picture时,换Picture1
(0).Picture图
Form1.Picture1(0).Picture = LoadPicture("e:\3ds4\images\t4.bmp"
′Picture1(1)?Picture从右向左折叠,露出Form1.Picture1(0).Picture
图形
For i = 0 To 50
Form1.Picture1(1).Width = w1 - i * w1 / 50
Next i
′Picture1(1).Picture为不可见状态时,换图再次从左向右拉开形成图形
清屏效果
Form1.Picture1(1).Picture = LoadPicture(″e:3ds4\images\t5.bmp″)
Form1.Picture1(1).Width = 0
For i = 0 To 50 ′step w1/50′
Form1.Picture1(1).Width = i * w1 / 50
Next i
′当Picture1(1).Picture完全遮住Picture1(0).Picture时,再次换 Picture1(0).Picture图
Form1.Picture1(0).Picture = LoadPicture(″e:\3ds4\images\t7.bmp″)
′当Picture1(1).Picture从下向上折叠,露出Form1.Picture1(0).Picture图形
Form1.Picture1(1).Height = h1
For i = 0 To 50
Form1.Picture1(1).Height = h1 - i * h1 / 50
Next i
′当Picture1(1).Picture为不可见状态时,换图再次从上向下拉开形成图形
清屏效果。
Form1.Picture1(1).Picture = LoadPicture(″e:3ds4\images\t6.bmp″)
For i = 0 To 50
Form1.Picture1(1).Height = i * h1 / 50
Next i
End Sub
Private Sub Command2_Click()
End
End Sub
四、说明
当两个以上256色的图形文件同时在一屏幕显示,由于它们分享调色板颜色
资源,若它们使用的颜色截然不同,就会出现颜色失真现象。应尽量避免同时使
用两个256色的图形文件。如果你的图像可通过扫描获得,你应将所有图片一次
扫描得到一个大图像文件,再将其裁剪成各尺寸相同的小图,这样即可完全避免
上述颜色失真现象。
用Visual Basic 定制BMP文件
在用VB编制绘图程序时,有时需要将窗体或图片框上的绘图结果
形成一个定制的图形文件保存起来,以便以后浏览或修改。这一功能
可以用VB本身带有的SavePicture语句来完成。
SavePicture语句将窗体、图象控件或图片框中的图形图象保存
到磁盘上的一个文件中,这些图象可以是使用画图方法(Line,Circle,
Pset)设计出来的,也可以存储那些通过设置窗体或图片框的图片属
性或者通过PaintPicture方法或Load?Picture函数载入的图象。这
些载入的图象可以是BMP、ICO或WMF图形文件。
SavePicture语句的语法格式如下:
SavePicture picture,stringexpression,参数picture为窗
体或图片框的picture或image属性;
参数strngexpression为保存的文件名。
下面举一个具体的程序来说明定制图象文件的过程:
1 创建一个新的项目文件,在Forml中加入一个图象控件Picturel,
将Picture1的AutoRedraw属性设置为True。
2.在Form-Load()事件中,加入如下代码:
Private Sub Form-Load()
Dim CX As Integer
Dim CY As Integer
Dim Limit As Integer
Dim Radius As Integer
CX=1000
CY=1000
For Radius=0 To Limit
Picturel.Circle(CX,CY),Radius,RGB(Rnd* 255,Rnd* 255,
Rnd*255)
Next Radius
SavePicture Picturel.Image,"c:\custom.bmp"
End Sub
执行此程序就会把图片框Picturel上的图象保存在C盘根目录下custom.
bmp图象文件中。
最后有两点需要指出:
1.在使用SavePicture语句之前,必须先将窗体或图片框的AutoRedraw
属性设为True,否则保留的将是一张空图。
2.使用Image属性保存的用画图命令(如Line,Cirele,Pset或Print)
画出来的图形总是以BMP文件格式保存。但在程序设计时如果使用窗体或图片
框的Picture属性载入或在程序运行时通过LoadPicture函数载入的图象,使
用SavePicture语句存储时,存储的文件格式同其载入前的文件格式一样
(如ICO格式等)。
VB实现图形动画的三种方法
VB在实现图形动画方面,有其独到之处,下面笔者就谈谈使用VB专业版
实现图形动画的三种方法。
动画由两个基本部分组成。一是物体相对于屏幕的运动,即屏幕级动画;
二是物体内部的运动,即相对符号的动画。制作动画的原理就是画完一幅图形,
清除它的屏幕显示部分,再在新位置画第二幅图形,如此交替下去,利用人眼
的视觉效应,就可以产生动画效果,VB实现动画的原理也如此,但VB它不要求
编程人员详细了解图形如何再现和清除,这些工作由VB提供的工具来做,这样
就使VB实现动画很方便,编程也很简捷。
1.控制的移动。采用控制的移动技术可实现屏幕级动画,而控制移动方式
又可分两种:一是在程序运行过程中,随时更改控制的位置坐标Left、Top属性,
使控制出现动态;二是对控制调用MOVE方法,产生移动的效果。这里的控制可
以是命令按钮、文本框、图形框、图像框、标签等。
2.利用动画按钮控制。VB的工具箱中专门提供了一个动画按钮控制
(Animated Button Control)进行动画设计,该工具在Windows\system子目
录下以Anibuton.vbx文件存放,用时可加入项目文件中,这种方法实现动画的
过程与电影胶片的放映极为相似,它将多幅图像装入内存,并赋予序号,通过定
时或鼠标操作进行图像的切换,通过这种方法可实现相对符号的动画。此控制的
有关属性介绍如下:
(1)Picture和Frame属性:Picture属性可装入多幅图像,由Frame属性
作为控制中多幅图像数组的索引,通过选择Frame值来指定访问或装入哪一幅图
像,这里Picture属性可装入.bmp、.ico和.wmf文件。
(2)Cycle属性:该属性可设置动画控制中多幅图像的显示方式
(3)PictDrawMode属性:该属性设置控制的大小与装入图像大小之间的
调整关系。
(4)Speed属性:表示动态切换多幅图的速度,以毫秒(ms)为单位,一
般设置小于100范围内。
(5)Specialop属性:该属性在程序运行时设置,与定时器连用,
来模拟鼠的Click操作,不需用户操作触发,而由系统自动触发进行动态图的切换。
3.利用图片剪切换控制。该控制也提供了在一个控制上存储多个图像或图标
信息的技术,正如用动画按钮一样,它保存Windows资源并可快速访问多幅图像,
该控制的访问方式不是依次切换多幅图,而是先将多幅图放置在一个控制中,然后
在程序设计时利用选择控制中的区域,将图动态剪切下来放置于图片框中进行显示,
程序控制每间隔一定时间剪切并显示一幅图,这样便可产生动画效果。该工具以
Picelip.VBX文件存于Windows\system子目录中,需要时可装入项目文件
中。此控制有关属性介绍如下:
(1)Rows Cols属性:规定该控制总的行列数。
(2)Picture属性:装入图像信息,仅能装入位图.bmp文件。
(3)Clip X、Clip Y属性:指定要剪切图位于控制中的位置,左上角坐标。
(4)ClipWidth、ClipHeight属性:表示需剪切图的大小,即指定剪切区域。
(5)Clip属性:设计时无效,执行时只读,用于返回(3)、(4)两项指
定的图像信息。
(6)Grahiceell属性:该属性为一个数组,用于访问Picture属
性装入图像中的第一个图像元素。
(7)Stretch X、Stretch Y属性:设计时无效,执行时只读,在将被选中
图像装入拷贝时定义大小显示区域,单位为像素(Pixels)。
以上笔者只谈了VB实现图形动画的基本方法,有兴趣的读者可参考有关书目。
用Visual Basic的Move方法实现动画效果
Visual Basic和结构化程序相比,增加了对象的“方法”功能。充分掌握这
种不同于对象属性的“方法”,对可视化应用的开发极为重要。下面,以VB4.0的
move方法为例,说明该方法在动画中的应用。
本例欲通过move方法完成一只蝴蝶的飞翔过程。通过定时器的中断,每隔一
定时间(本例为0.2秒),在屏幕上移动蝴蝶的位置,并且改变蝴蝶的形态(展翅
和收翅),于是利用视觉的暂存效应,看到蝴蝶栩栩如生的飞行场面。蝴蝶的位置
的移动就由move方法来实现,move方法使用的格式如下:
对象. move left, top
其中left为对象左边界的水平坐标(x轴),top为对象上边界的垂直坐标
(Y轴),本例中的对象框(image box),名字为main。
蝴蝶的展翅和收翅图象由位图文件bfly1.bmp bfly2.bmp来提供,并可根据
需要制作其它飞行的位图文件,以使效果更加逼真。
本例中窗体结构和各个对象的属性设置如下:
对象
属性设置
窗体caption
蝴蝶飞行动画设计
图象框 name
main
picture
bfly1
图象框 name
openwings
picture
bfly1
图象框 name
closewings
picture
bfly2
命令框 name
command1
caption
E&xit
定时器 name
timer1
interval
200
有关程序比较简单,代码如下:
定时器中断程序:
Private SubTimer-Timer()
Static PickBmp As Integer
Main.Move Main.Left +20,Main.Top -5
If PickBmp Then
Main.Picture =Open Wings.Picture’Displays the open butterfly
picture.
Else
Main.Picture =Close Wings.Picture’Displays the closed butterfly
picture.
End If
PickBmp=Not PickBmp’Toggle the value.
End Sub
退出按钮(exit)程序:
Private Sub Command1-Click()
Unload Me
End
End Sub
这样,利用VB的move方法和其它对象属性,就可以实现更加复杂的动画
设计。
VB中实现图像特技的一种方法
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用
天各种图像显示特技。图像的切换技术能明显美化画面。用Visual Basic编
制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或
调用W indowsAPI函数BitBlt来实现这种功能。本文介绍用BitBlt函数实现
画面的各种切换方法,供大家参考。
假设有5个图像文件(Picture1-Picture5),我们的目标是让这5幅画
自动地循环显示,每幅画以某种切换方式出现,当有击鼠标动作时退出程序。
1 创建项目文件:
运行VB,建立一个新工程文件Project1,加入一个新的Form名称为Form1,
和一个模块文件Modull,在Form1中加入一个图画框Picture1和一个定时器Timer1。
设置各控件的属性如下:
Form1:AutoRedraw:True
ScaleMode:3
Picture1:AutoRedraw:True
ScaleMode:3
Visible:False
2 代码编写
Modull.bas中的内容(声明BitBlt函数):
Public Const SRCCOPY=&HCC0020’(DWORD)dest=source
Declare Function BitBlt Lib "gdi32"Alias "BitBlt"(By Val 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 Long ) As Long
这两句只要从Win32api.txt文件中粘贴即可。
Form1中的代码:
在Declare中定义全局变量:
Const bmpfilemax=5&总共5个bmp文件
Dim bmpfile(bmpfilemax)As String&bmp 文件的文件名数组
Dim drawbmpmode(bmpfilemax) As Integer&各画显示时的切换方式
Dim bmpnum,movestep,xmax,ymax As Integer
Dim kxy As Single &x,y二个方向的比例
程序运行时先作初始化工作:
Private Sub Form-Load ()
bmpnum=0 &当前文件号=0,第一个文件
bmpfile(0)=App.Path+''\bmp1.bmp'' bmpfile(1)=App.Path+''\bmp2.bmp''
bmpfile(2)=App.Path+''\bmp3.bmp''
bmpfile(3)=App.Path+''\bmp4.bmp''
bmpfile(4)=App.Path+''\bmp5.bmp''
drawbmpmode(0)=1
drawbmpmode(1)=5
drawbmpmode(2)=3
drawbmpmode(3)=4
drawbmpmode(4)=2
movestep=0 &步进参数
xmax=Form.ScaleWidth/2
ymax=Form.ScaleHeight/2
kxy =ymax/xmax
Picture1.Picture=LoadPicture(bmpfile(bmpnum))
Timer1.Interval=30 &定时器起动
End Sub
响应鼠标:
Private Sub Form-Click ()
End &当有击鼠标动作时程序结束
End Sub
切换演示工作主要在定时器中完成:
Private Sub Timer1-Timer ()
hDestDC=Form1.HDC&目标DC
hSrcDC=Picture1.hDC&源DC,画是从不可见的Picture1中拷贝到窗体
drawflag =drawbmpmode(bmpnum)&当前画出现的方式
Select Case drawflag
Case 1 &从中间逐步放大
endmax=xmax&用于结束判断
X1=xmax-movestep
w=movestep*2
Y1=Cint(ymax-movestep*kxy)
h=Cint(2*movestep*kxy)
i=BitBlt(hDestDC,X1,Y1,w,h,hSrcDC,X1,Y1,SRCCOPY)
Case 2 &从左到右
endmax=xmax
w=movestep*2
h=Form1.ScaleHeight
i=BitBlt(hDestDC,0,0,w,h,hSrcDC,X1,Y1,SRCCOPY)
Case 3 &左右向中间
endmax=xmax
w=movestep
h=Form1.ScaleHeight
i=BitBlt(hDestDC,0,0,w,h,hSrcDC,0,0,SRCCOPY) &左面部分
X1= Form1.ScaleWidth-movestep
i=BitBlt(hDestDC,X1,0,w,h,hSrcDC,X1,0,SRCCOPY) &左面部分
Case 4 &栅条状
endmax=CInt(2*xmax/10) &共分阶10条
tempi=CInt(2*xmax/10)
w=movestep
h=Form1.ScaleHeight
For ij=0 To 9
i=BitBlt(hDestDC,tempi*ij,0,w,h,hSrcDC,tempi*ij,0,SRCCOPY)
Next ij
Case 5 &棱形状
endmax=CInt(2*xmax/10)
tempi=CInt(2*xmax/10)
w=movestep
For ih=0 To w-1
For ik=0 To 9
For ij=0 To 9
l=tempi*ik+tempi/2
t=tempi*ij+tempi/2
i=BitBlt(hDestDC,1-(w-ih),t-ih,(w-ih)*2,1,hSrcDC,1-(w-ih),
t-ih, SRCCOPY)
i=BitBlt(hDestDC,1-(w-ih),t+ih,(w-ih)*2,1,hSrcDC,1-(w-ih),
t+ih, SRCCOPY)
Next ij
Next ik
Next ih
End Select
Form1.Refresh
movestep=movestep+2 &步进增加
If movestep>endmax Then&若步进够大,画面都已显示,本张画结束
切换
bmpnum=bmpnum+1 &进到下一张画
If bmpnum>=bmpfilemax Then&若5张画已显示完则再从第一张开始
bmpnum=0
End If
movestep=0
Picture1.Picture=LoadPicture(bmpfile(bmpnum))
End If
End Sub
放置“透明”的图片
在 VB 中,如果你试着把一只有鸟的图片放到背景的一棵树上,
你就会发现树会被鸟遮住一个矩形的区域(即鸟的图片矩形)。我们
可以通过以下方法使图片上非鸟的其它部分变透明:
我们可以利用一个 WinAPI 函数 BitBlt 对图形进行一系列的位
操作来达到此目的。
函数声明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt"
(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 Long) As Long
参数解释:
目标环境:hDestDC——目标设备环境;x——左上角;y——顶端;
nWidth——宽;nHeight——高
源环境:hSrcDC——源设备环境;xSrc——源左上角;ySrc——源
顶端;
dwRop——位处理操作,如 vbSrcAnd;vbSrcAnd;vbSrcCopy;
vbSrcErase;vbSrcInvert 等
(目标环境或源环境只能是 Picture, Form 或 Printer 对象。
各单位为象素。)
进行处理之前,我们需要对鸟的图片进行处理:先复制一份相同的
图形,将其应该透明之处(鸟的背景)设置为黑色(设此图为sPic),
再将另一图做以下处理:要复制的地方(鸟)设置为黑色,其余地方设
置(鸟的背景)为白色(设此图为Mask)。设树的图形为名dPic。
最后,请加入以下代码:
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,Mask.hdc,
0,0,vbScrCopy)
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,sPic.hdc,
0,0,vbScrInvert)
后记:
1、VB 中的 PaintPicture 方法提供类似功能,但速度不及此方法。
2、在此方法上稍微加入一些代码,就不难实现动画的显示。
3、VB 例子中的 CallDlls 就使用此方法。
在图片上平滑移动文字
在很多电影及游戏的结尾,你可以看到文本在图片上平滑地卷到屏
幕的上方(如电影的版权声明等),在 VB 中,可以使用以下步骤及方
法实现此“特技”:
1、新建一工程文件,缺省创建 Form1;
2、在 Form1 上放置 Picture Box 控件 Picture1,选择背景图片;
3、选择 Picture1(即以它为一个容器),在上面放置 Label 控件
Label1,设置 Label1 的 BorderStyle 属性为 0(透明--即在控件后
的背景色和任何图片都是可见的),设置 Caption 为待移动的字符串;
4、在 Form1 上放置 Timer 控件 Timer1,设置 Enabled 属性为
True,设置 Interval 为 100,在 Timer1 的 Timer 事件中加入以下程序:
iStep=20
Label1.Top=Label1.Top - iStep
Interval 决定图形移动速度;iStep 决定图形移动的平滑程度。
5、在 Form_Load 事件中加入以下程序:Lable1.Top = Picture1.
ScaleHeight
到此,你就可以实现文字在图形上的平滑移动。本例产生的效果是由
下向上移动,如果你将程序稍加改变,就可以实现由下到上,由左到右,
由右到左等“特技”效果。
播放 AVI
声明:
Declare Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, ByVal _
lpstrReturnString As String, ByVal uReturnLength _
As Long, ByVal hwndCallback As Long) As Long
代码:
Dim returnstring As String
FileName As String
returnstring = Space(127)
FileName = "C:\A1.avi"
erg = mciSendString("open " & Chr$(34) & FileName &
Chr$(34) & " type avivideo alias video", returnstring,
127, 0)
erg = mciSendString("set video time format ms",
returnstring, 127, 0)
erg = mciSendString("play video from 0", returnstring,
127, 0)
'记着关闭!
erg = mciSendString("close video", returnstring, 127, 0)
捕捉屏幕图象
声明:
Private Declare Function ReleaseDC Lib "user32" (ByVal
hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal
hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32"
(ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal
hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As
Long) As Long
Private 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 Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA"
(ByVal lpDriverName As String, ByVal lpDeviceName As String,
ByVal lpOutput As String, lpInitData As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32"
(ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32"
(ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight
As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
函数:
Sub ScrnCap(Lt, Top, Rt, Bot)
rWidth = Rt - Lt
rHeight = Bot - Top
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
SelectObject DestDC, BHandle
BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Lt, Top,
&HCC0020
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, BHandle
CloseClipboard
DeleteDC DestDC
ReleaseDC DHandle, SourceDC
End Sub
以下的示例把屏幕图象捕捉后,放到Picture1 中。
Sub Command1_Click()
Form1.Visible = False
ScrnCap 0, 0, 640, 480
Form1.Visible = True
picture1 = Clipboard.GetData()
End Sub |
[Move]认识你,才知道有一份心情叫依恋,有一种感觉叫思念,有一句誓言叫偕老![/COLOR][/FONT][/SIZE][/Move] |
|