荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: lovely (Waiting for you.....), 信区: Multimedia
标  题: 多媒体的编程技巧
发信站: 荔园晨风BBS站 (2005年04月26日19:47:04 星期二), 站内信件

1、巧用VB设计图像切换效果
2、Web动画图像分解在VB动画设计中的应用
3、图像艺术清屏
4、用Visual Basic 定制BMP文件
5、VB实现图形动画的三种方法
6、用Visual Basic的Move方法实现动画效果
7、VB中实现图像特技的一种方法
8、放置“透明”的图片
9、在图片上平滑移动文字
10、播放 AVI
11、捕捉屏幕图象
12、创建自定义的光标
13、用VB进行多媒体程序设计初步
14、VB的多媒体控件VBPLAY.VBX简介
15、在VB应用程序中恰当的使用声音
16、点到即播的多媒体点播机
17、播放资源文件文件中的声音
18、播放背景音乐
19、在VB5中播放MP3文件
20、巧用VB编程使XMPLAYER自动播放VCD
21、如何播放 .wav 声音文件?
22、如何连续播放 .wav 声音文件?
23、如何播放 .flc 动画档?
24、如何将 .flc 动画档放在某一个 hWnd 之中播放?

巧用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、vbPatInvert和
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.ScaleWidth
,t,0,h,Picture1.ScaleWid
th,t,vbSrcCopy
  hΚh+t
  EndIf
  EndSub



Web动画图像分解在VB动画设计中的应用
武汉 任清珍 黄可
    笔者每次浏览Web网页时,总是被许多生动有趣的小动画深深吸引,十分佩服
作者的想象力和制作技巧。在使用VB进行应用软件开发设计中,为使软件的人机界
面新颖友好,总想加点动画作点缀,但又常常苦于一幅幅动画图片的绘制或寻找!
因此萌发了一种奇妙的设想:能否让Web页面上的动画在VB应用软件界面上活起来
?幸运的是,当前图像处理软件甚多,终于将笔者的这一设想变成了现实。
VB动画设计
    动画的制作原理很简单:首先绘制几幅相近但又有细微变化的图片,然后每隔
一段很短的时间就依次显示其中一幅,由于人眼视觉暂留,就能看到连贯的动画效
果。 使用VB进行动画设计非常方便,因为其工具箱中有图像、图片、时钟控件。
只要获得了一幅幅动画单幅图像文件,把它们放入图像控制数组中去,便可用时钟
控件的控制属性Interval来控制每幅图片的显示间隔,把最终动画显示的位置确定
好后,按时间间隔依次从图像控制数组中取出一幅图显示。如此交替反复显示,即
可产生动画效果,编程实现比较简单。
    VB动画设计所能接收的单幅图片文件的格式有四种,即*.Bmp、*.Ico、*.Wmf
和*.Dib。其中*.Bmp文件的来源最广,不但可以使用Windows环境下的各种绘图软
件来绘制(但费时费力,且不是每个人都有绘画的天才),也可以使用Windows所提
供的现成的位图文件,或者用彩色扫描仪扫入等等。在此,笔者所感兴趣的则是从
Internet上Web站点网页上下载自己喜爱的动画图像文件,再经过图形软件分解、
处理成一幅幅*.Bmp图片文件,它们会给软件的人机界面带来全新的感受。
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与软件编程
联系起来,无疑提高了应用软件的制作效率和质量。



图像艺术清屏
山东李鲁群
    几年前,《电脑爱好者》曾以《趣味清屏》一文抛砖引玉,使广大电脑发烧友
大开眼界,并以此引出千姿百态DOS下的清屏方法。而随着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资源并可快速访问多幅图像,该
控制的访问方式不是依次切换多幅图,而是先将多幅图放置在一个控制中,然后在
程序设计时利用选择控制中的区域,将图动态剪切下来放置于图片框中进行显示,
程序控制每间隔一定时间剪切并显示一幅图,这样便可产生动画效果。该工具以P
icelip.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



创建自定义的光标
谭翁
    当在设计一个应用程序时,Visual Basic允许程序员将许多控件的
MousePointer属性设计成12个预先定义好的鼠标光标之一。典型情况是程序员希望
改变一个控件的MousePointer属性,以告诉程序的用户有某种类型的行为被进行了
。例如,沙漏光标被用来指示一个消耗时间的过程。另外,可以改变光标来仅仅通
知用户他已经将鼠标的指针指向了一个特殊的控件,如一个文件列表框。要做到这
些,程序员只需要简单地在Visual Basic程序中在适当时刻改变该控件的
MousePointer属性即可。
    然而,有些程序员或许会希望显示一个12个预定义形状中的光标之外的光标。
本文说明如何创建一个不同的鼠标指针(光标),包括为一个没有MousePointer属
性的控件创建光标。
改变光标(鼠标指针)
    要在Visual Basic应用程序中将光标(鼠标指针)改变成个不同的形状,可以
添加代码来改变希望监视的控件的MouseMove和DragOver事件。
    MouseMove事件所包含的代码用于触发该控件的Drag方法。当鼠标在被选中的
控件上移动的时候,轮流显示新的鼠标指针。当鼠标指针离开该控件时,则
DragOver事件被触发。在Visual Basic程序中,可以重新复位此Drag属性,以便以
前的鼠标指针能够被再次显示出来。
样例程序
    下面的程序实现当鼠标指针移动到一个文件列表框控件上时,将其改变成不同
的形状。
    在Visual Basic中开始一个新的工程,采用缺省的方法建立Form1。
    在Form1上添加一个文件列表框控件,采用缺省的方法建立File1。
    将File1控件的DragIcon属性设置为所选择的.ICO文件。
    将如下代码添加到File1的MouseMove事件中:
Private Sub File1_MouseMove(ButtonAs Integer, Shift As Integer, X As
Single, Y As Single)
File1.Drag 1 'icon on
End Sub
    将如下代码添加到Form1的DragOver事件中:
Private Sub Form_DragOver(Source As Control, X As Single, Y As Single,
State As Integer)
File1.Drag 0 'icon off
End Sub
    按下F5功能键执行此程序。得到的运行结果是:将鼠标指针移动到该文件列表
框控件上时,程序将把所选中的.ICO文件作为缺省的鼠标光标;将鼠标指针离开该
控件时,光标则会自动恢复为缺省的形状。



用VB进行多媒体程序设计初步
    VB(Visual Basic)具有很强的多媒体处理控制功能,VB的多媒体控制
MCI(Media control interface)包括一套控制音频和视频设备但具有与设备无关的
命令,用它来进行多媒体设计是很方便的。比如:你也许想拥有一个自己编写的
CD播放器,那么利用VB的MCI只需写几行代码就可
    生成一个功能比较齐全的CD播放器。下面简单谈谈用VB的MCI进行多媒体设计
的初步知识并给出一个非常简单的CD播放器的例子。
    在使用MCI之前必须安装好多媒体设备如声卡、CD—ROM等以及这些设备的驱动
程序,否则MCI将不听指挥。
一、MCI控制的安装
    MCI控制在VB不同版本中的安装方法是不一样的。在VB 3.0专业版中,MCI控制
文件为MCI.VBX,在VB 4.0中MCI控制文件为MCI16.OCX(16位)、MCI32.OCX(32位)。
一般情况下MCI控制在启动VB之后并没有加入到工具箱中(TOOLBOX),需要自己动手
安装它。
    1.VB 3.0中MCI的安装。
    打开VB的FILE菜单,选择Add File项,从Windows\system目录下找到MCI.VBX
,选择OK即可,这时你将发现TOOLBOX最后又多了一个工具,这就是MCI。如果你经
常要用它,建议在VB目录下找到Autoload.mak文件,用字处理软件打开它,把
MCI.VBX添加在其中,这样每次启动VB时就将其自动调入。
    2.VB 4.0中MCI的安装。
    VB 4.0支持16位和32位两种系统,在WINDOWS 3.1下只能使用16位系统。MCI不
能和VB 3.0中一样用Add File调入,如果你这样做将会发现系统提示错误,需在
Autoload.mak文件中调入。笔者打开Autoload.mak文件后发现调用格式为:
OBJECT={序列号}#1.0#0;文件名,不知道MCI16.OCX的序列号是无法安装的。幸
好在VB目录下的子目录SAMPLE下有一个MCI的子目录,进入它可以看到有一个
MCITEST.MAK文件,打开它可以看到有:Object={C1A8AF28-1257-101B-8FB0-
0020AF039CA3}#1.0#0;MCI32.OCX一行(也许您的序列号不一定和这相同),将
这一行复制到Autoload.mak文件中即可。由于本人使用的是WINDOWS 3.1,在安装
VB 4.0时32位系统无法装入,硬盘中根本没有MCI32.OCX文件,VB何以将MCI32.
OCX调入呢?经试验发现VB以序列号选择文件,可能上述序列号是MCI16.OCX文件的
序列号,进一步试验发现即使将序列号后面的MCI32.OCX去掉也可调入,这进一步
说明了VB 4.0中一个OCX文件有一个对应的序列号,因此绝对不能改变序列号,否
则将无法正确调入所需的文件。MCI安装完毕,用鼠标双击工具箱的MCI图标,如果
在Form中出现9个熟悉的按扭,那么安装就成功了。

二、MCI的属性和事件
    MCI提供许多关于MCI控制方面的属性和事件。比较常用的属性有:
    Button visible 决定该按钮在MCI控制中是否可见。
    Command 要执行的MCI命令,如Open Close Play Stop Eject等。
    Device Type 要打开的MCI设备类型,如动画播放设备、MIDI序列发生器、激
光视盘机、WAV文件播放器、录相机等。
    Filename 使用Open命令打开或Save命令保存的文件名。
    Length 确定一个文件或CD唱片的长度。
    Track 指定特定的轨道,供Tracklength和Trackposition使用。
    Tracks 当前MCI设备的轨道数。
    Tracklength 在当前时间格式下,传回Track所指轨道的时间长度。
    Trackposition 在当前时间格式下,传回Track所指轨道的起始位置。
    Visible 决定在运行时刻多媒体MCI控制是否可见。
比较常用的事件有:
    Buttonclick 当用户在多媒体MCI控制的按钮上按下或释放鼠标时产生该事件
,每一个Buttonclick事件缺省执行一个MCI命令。
    Buttoncompleted 当多媒体MCI控制按钮激活的MCI命令完成后发送。
    Statusupdate 这个事件可监测目前多媒体设备的状态信息,比如用滚动条来
表示当前轨道的位置。
    详细的属性和事件的用法请参看控制帮助文件。

三、CD播放器的例子
    对初学者来说,能利用入门知识编写一个的成功小程序是很鼓舞人心的,下面
我们来编写一个非常简单的例子:迷你CD播放器。
    在MCI调入Toolbox之后,双击MCI工具,将会在Form中出现9个按钮,用鼠标移
动这些按钮至合适的位置,然后双击Form窗体,把下面的代码加入到事件中:
        Sub Form_Load()
        MMControl1.DeviceType = “CDaudio" 'MCI设备类型为CD唱片
        MMControl1.Command = “open" '打开设备
        End Sub
        Sub Form_Unload(Cancel As Integer)
        MMControl1.Command = “close" '退出时关闭MCI设备
        End Sub
    保存文件,在CD驱动器中放入一张CD唱片,然后运行,你将发现九个按钮中
Prev、Next、Play、Eject四个按钮变黑(有效状态),点一下Play按钮,音乐出
来了!若驱动器中无CD盘则所有按钮都处于无效状态。这样一个简易CD播放器就完
成了,它具有四种功能,但自己动手写的代码只有上面加注释的三行。这个CD播放
器有点太简单了,下面就看你的了,你可以加入一些文字信息如开发时间、作者、
版权等,再进一步学习MCI可加入其他功能如显示播放时间、曲目等。



VB的多媒体控件VBPLAY.VBX简介
刘强
    VB是一种编程式多媒体开发工具,用VB开发多媒体的方法有很多。归结一下有
以下四种:自行编写程序代码实现,使用对象连接和嵌入OLE2.0,调用API有关多
媒体的函数,使用第三方VB控件开发商制作的多媒体控件VBX。其中第四种方法最
简便,效果也最明显。
    下文将简要介绍Autodesk公司的多媒体控件VBPLAY.VBX的功能和使用方法。
    启动VB专业版后,选择File—Add File…,在WINDOWS的SYSTEM目录下选择
VBPLAY.VBX,将VBPLAY.VBX加入到工具箱中,就可以看到ANIMATION著名的图标。
它的主要属性介绍如下:
    1、具有基本属性:
    name,height,width,top,left,forecolor,backcolor,enabled,visible,
index, 还有一些特殊属性。
    2、BorderStyle属性,设定边界条件。分别为0-none,表示无边界,1-Fixed
Single,表示固定单线框,2-Sizable(缺省值),可调尺寸,3-Fixed Double,固定
双线框。这些属性与其他控件类似。
    3、All Color:保留所有WINDOWS系统可用的颜色。Colorcycling:保留
WINDOWS系统调色板的颜色。
    4、AniHeight 和Aniwidth,设定一个动画的幅面。
    5,Autoplay属性,设定自动播放功能。如果设定为TRUE,则程序运行时动画文
件自动播放,若设为FALSE,则需要用程序代码控制。
    6、BeginFade,BeginFadeTime,Endfade,EndfadeTime,这是VBPLAY.VBX最精彩
的部分,用这几个简单的属性就可以实现图象的淡入淡出效果。其中:
    BeginFade表示动画开始时的效果设定。有三个选择项。cut:切换效果,无淡
入淡出;fade to/From Black 即淡入效果;Fade to/From White 即淡出效果。以
前必须调用Bitbil这样的W INDOWS API函数才能实现的功能现在只需设定属性即可
实现。
    BeginFadeTime设定淡入淡出效果执行的时间,与Timer的属性Interval一样,
以毫秒为单位。
    EndFade和Endfadetime表示结尾处的淡入淡出效果设定,其选项与BeginFade
和BeginFadeTime相似。
    7、FullScreen:全屏幕播放。
    8、HideAnimation:如果不是在播放状态下,即在设计状态下,不要将画面显
示出来。
    9、LoopFrame:设定是否循环播放。可选值为TRUE或FALSE。
    10、MemoryLoad:设定为TRUE则在打开动画时将它载入内存中,这样可以得到
较快的播放速度。
    11、play、pause、pauseatend,设定播放、暂停以及播放完后暂停的时间,
以秒为单位。
    12、有关SOUND的属性:Sound属性会打开一个对话框,在对话框中选择背景音
乐,以真正实现“影音同步”,SoundDelay属性设定声音播放的延迟时间,以毫秒
为单位。如果为负数,则表示在动画前先播放音乐,SoundRepeats属性声音播放的
次数。
    13、AniSettings属性,其上有“Click Here For Dialog”的标识,单击后会
弹出对话框。以上所提到的大部分属性可以在对话框中设定,“TEST”按钮可以测
试效果,“TRANSITIONS”可以设定淡入淡出的效果。
    下面给出一例,在VB专业版中调试通过。
    各控件的属性设置如下:
    FORM1: caption:动画演示
    windowstate:2-maxizimed
    ANIMATION1: ANIMATION:C:\DEMO\DEMO.FLC
    BeginFade:fade to/From Black
    BeginFadeTime:3000
    EndFade:Fade to/From White
    Endfadetime:3000
    HideAnimation:true
    FullScreen:true
    Sound:C:\DEMO\DEMO.WAV
    SoundDelay:-2000
    SoundRepeats:0
    Type:(FLI/FLC)
    COMMAND1: caption:播放
    COMMAND2: caption:停止
    而源程序只有两行:
    Sub Command3D1_Click ()
    animation1.Play = True
    End Sub
    Sub Command3D2_Click ()
    End
    End Sub
    注意例子中播放3DS的FLI/FLC文件必须在WINDOWS的SYSTEM的目录中载入播放
FLI/FLC动画文件的动态连接库AAPLAY.DLL。
    这样我们就实现了一幅影音同步的多媒体作品,是不是很简单?不要再犹豫了
,赶快上机试一下,你会叹服于VBPLAY.VBX的强大功能。



在VB应用程序中恰当的使用声音
刘强
    众所周知,Visual Basic是功能非常强大的多媒体开发工具,它有丰富的函数
和方法处理各种各样的多媒体信息,能够很灵活的操作图形、声音、动画、影象等
多媒体素材。但有时我们使用Visual Basic开发非多媒体应用程序,并不需要在应
用程序中大量的使用声音,而只是需要在特定的场合出现。如Windows的警告声。
这就要求程序员在恰当的环境中恰当的使用声音文件,既不失去VB在多媒体方面的
特长,又能够为应用程序增加吸引人的效果。
    VB可以用于输出声音的方法很多,归结一下,大概有以下四种:
    1.利用Beep语句。
    这是VB系统提供的一条利用计算机扬声器发声的语句,它只能够发出简单的蜂
鸣声,但在应用程序中大量用于输出警告的信息。如下例允许用户在文本框中输入
数字,当用户输入错误时,系统会报警提示。
        Sub Text1_KeyPress (keyascii As Integer)
        If keyascii < 48 Or keyascii > 57 Then
        Beep:Beep: Beep
        keyascii = 0
        End If
        End Sub
    2.其实计算机的蜂鸣器也可以发出不同频率、音高的声音,从而奏出美妙的音
乐。方法是调用Windows的一些有关发声的API函数。Windows系统包含十六个声音
函数,它们都存放在Windows的SOUND.DRV这个驱动程序所包含的动态连接库中。其
中最常用的四个函数是OpenSound,CloseSound,SetVoiceNote,StartSound。其
声明格式如下:
        Declare Function OpenSound Lib "Sound" () As Integer
        Declare Sub CloseSound Lib "Sound" ()
        Declare Function SetVoiceNote Lib "Sound" (ByVal nVoice As
Integer, ByVal nValue As Integer, ByVal nLength As Integer, ByVal nCdots
 As Integer) As Integer
        Declare Function StartSound Lib "Sound" () As Integer
    在Visual Basic的通用过程中声明上述函数后,就可以象使用Visual Basic自
己的函数一样使用Windows的API函数。
    下面给出一个例子,只需要在窗体中放置7个按钮组成的控件数组,调用上述
函数就可以简单的实现准确的音阶:
        Sub Command1_Click (index As Integer)
        a% = OpenSound()
        Select Case index
        Case 0: f = 37
        Case 1: f = 39
        Case 2: f = 41
        Case 3: f = 42
        Case 4: f = 44
        Case 5: f = 46
        Case 6: f = 48
        End Select
        m1% = SetVoiceNote(1, f, 4, 0)
        m2% = StartSound()
        End Sub
    3.Visual Basic是第一个支持对象连接与嵌入(OLE)的开发工具,利用OLE可
以简单的在应用程序中插入声音文件。这也是使用Visual Basic开发多媒体软件常
用的方法。使用过VB的读者都知道,VB的ToolBox中就有OLE2.0控件。当我们双击
OLE2.0控件时,会弹出“Insert Object”窗口,在窗口中选择对象类型Object
Type为声音文件,选择“Create from File”,指定硬盘上声音文件的位置,同时
确认Link方式。这些步骤其实是在设置OLE2.0的属性。通过按F4打开Properties属
性窗口,设置其中的Class、SourceDoc、SourceItem等属性也可完成这一工作。按
F5运行程序,双击OLE对象时就会发声。与播放各种声音文件相关的属性为Action
,通过设置Action属性可以打开、驱动、删除相应的声音对象。如下例在窗体装入
时调用声音文件:
        Sub Form_Load ()
        ole1.Class = "soundrec"
        ole1.SourceDoc = "c:\windows\ding.wav"
        ole1.Action = 1
        ole1.Action = 7
        End Sub
    4.利用Visual Basic的多媒体控件MCI.VBX。
    使用MCI.VBX是Visual Basic开发多媒体软件的主要方法。利用MCI.VBX在应用
程序中加入声音文件是轻而易举的事。有大量的专著介绍MCI.VBX的使用方法,这
里就不在赘述。
    总的说来,以上四种方法的复杂程度依次递增,对系统的要求和消耗的系统资
源也越来越大。因而,作为一个VB程序员,在应用程序中,应该能够熟练而准确的
使用上述四种方法并在恰当的场合选择某一种方法,就可以为自己的程序增添效果
同时并不使软件显得华而不实。



点到即播的多媒体点播机
江西 陈前波
    现在用光盘发行的游戏,有很多以后辍名为.MID和.WAV形式存放的多媒体声音
和音乐文件,为了欣赏这些精彩的乐曲,一般是用WINDOWS附件组中的媒体播放器
或其他的应用程序来打开它们:单击“文件”菜单,选“打开”项,程序弹出“打
开文件”对话盒,再选文件类型、驱动器、目录、文件,确认后,再单击“放音”
。操作规范但是繁琐无聊,如果是听少量几个文件尚可,文件多了便有不胜其烦之
感。笔者接触了Visual Basic 3.0后 ,用其编制了一个多媒体点播机,界面美观
、操作快捷高效,用鼠标单击文件名即可放音,还可下拉光标键实现连续放音。(
窗体中的控制布局图及设置后的界面图从略)。
MYPLAY.FRM
D:WINDOWS\SYSTEM\MCI.VBX
ProjWinSize=342,426,248,215
ProjWinShow=2
IconForm=″Forml″
Title=″多媒体点播机″
ExeName=″MYPLAY.EXE″
Sub Commmand2_Click()
End Sub
Sub Dirl_Change()
MMControl1.DeviceType = "waveaudio"
If optionl.Value <> 0 Then
MMControl1.DeviceType = "seqencer"
End If
MMControl1.UpdateInterval = 0
If Not MMControl1.Mode = 524 Then
MMControl1.Command = "close"
End If
If Right(file.Path, 1) <> "\" Then
MMControl1.FileName = file.Path & "\" & file1.FileName
Else
MMControl1.FileName = file.Path & file1.FileName
End If
MMControl1.Commmand = "open"
label6.Caption = MMControl1.FileNane
MMControl1.Command = "play"
End Sub
Sub MMControl1_PauseClick(Cancel As Integer)
MMControl1.UpdateInterval = 0
End Sub
Sub MMControl1_playclick(Cancel As Integer)
MMControl1.UpdateInterval = 50
End Sub
Sub MMControl1_PrevClick(Cancel As Integer)
MMControl1.UpdateInterval = 0
MMControl1.Command = "prev"
End Sub
Sub MMContrlo1_StatusUpdate()
If Not MMControl1.Mode = 526 Then
MMControl1.UpdateInterval = 0
End If
End Sub



播放资源文件文件中的声音
    VB 提供的方法使我们可以很容易地使用资源文件中的字符、图片等资源。我
们可以用以下方法播放资源文件中的 wav 声音:
    首先,在你的资源文件的源文件 (RC) 文件加入下面一行:
      MySound WAVE c:\music\vanhalen.wav
    然后将其编译为 RES 文件。最后使用下面的声明及代码:
      Private Declare Function PlaySound Lib _ "winmm.dll" Alias
"PlaySoundA" ( _ ByVal lpszName As String, _ ByVal hModule As Long, _
ByVal dwFlags As Long) As Long
      Private Const SND_ASYNC& = &H1
      Private Const SND_NODEFAULT& = &H2
      Private Const SND_RESOURCE& = &H40004
      Dim hInst As Long
      Dim sSoundName As String
      Dim lFlags As Long
      Dim lRet As Long
      Private Sub Command1_Click()
      hInst = App.hInstance
      sSoundName = "MySound"
      lFlags = SND_RESOURCE + SND_ASYNC + _ SND_NODEFAULT
      lRet = PlaySound(sSoundName, hInst, lFlags)
      End Sub



播放背景音乐
    声明:
      Declare Function MCISendString& Lib "MMSYSTEM" (ByVal
LPSTRCOMMAND$, ByVal LPSTRRETURNSTR As Any, ByVal WRETURNLEN%, ByVal
HCALLBACK%)
    开始播放:
      R% = MCISendString&("OPEN EXAMPLE.MID TYPE SEQUENCER ALIAS NN",
0&, 0, 0)
      R% = MCISendString&("PLAY NN FROM 0", 0&, 0, 0)
      R% = MCISendString&("CLOSE ANIMATION", 0&, 0, 0)
    停止:
      R% = MCISendString&("OPEN EXAMPLE.MID TYPE SEQUENCER ALIAS NN",
0&, 0, 0)
      R% = MCISendString&("STOP NN", 0&, 0, 0)
      R% = MCISendString&("CLOSE ANIMATION", 0&, 0, 0)
    其中EXAMPLE.MID 为播放的文件,NN为自定义名称标志。



在VB5中播放MP3文件
湖南 吴 炯
    MP3自问世以来,因其声音还原好,压缩比率高而深受欢迎。目前,市面上有
很多种MP3播放器供用户选择使用。但是,怎样在自己的应用程序中播放MP3文件呢
?最近,本人在网上下载了一个播放MP3文件的ActiveX控件——mp3play.ocx,该
控件可在VB5.0、Delphi 3.0及VC5.0中使用。下面将使用该控件在VB5.0中播放
MP3文件的方法介绍给大家。
    先启动VB5.0,添加一个新窗体到工程中。单击“工程”*“部件”菜单,将下
载的mp3play.ocx控件添加到VB中。此时,在工具箱中将可以看到新增加了一个蓝
色小喇叭图标,这就是mp3play.ocx控件。
    单击工具箱中的MP3控件,将其添加到窗体中,名称设为MP3Play,属性
Visible设为False。
    在窗体中添加“播放”命令按钮,其名称为btn_command1,属性Caption为“
播放”,在其Click事件中填写以下代码:
        Private Sub btn_command1_Click()
        MP3Play.Open(“c:\pop_music\ 心 太 软.mp3”,“ ”) // 指 定 所
要 播 放MP3 文 件 所 在 的 位 置 为C 盘pop_music 目 录 里
        MP3Play.play
        End Sub
    在窗体中添加“停止”命令按钮,其名称为btn_command2,属性Caption为“
停止”, 在其Click事件中填写以下代码:
Private Sub btn_command2_Click()
    MP3Play.Stop
End Sub
    执行该程序,单击“播放”按钮,将播放您指定的MP3音乐。若要停止,单击
“停止”按钮即可。


巧用VB编程使XMPLAYER自动播放VCD
广东 徐林清
    XingMPEG Player是软解压播放VCD的优秀软件,但调入XMplayer、进入播放
状态、隐藏面板等一系列操作,需要多次点击鼠标,较为麻烦。下面用VISUAL
BASIC程序首先检查光驱是否准备好或光驱中是否为 VCD光碟,然后利用VB模拟
XingMPEG的键盘动作,通过短短的几行程序,实现 VCD光盘的自动播放。
    ①进入VB环境,设置窗体FORM1的Visible属性为 False,然后在窗体上建立一
个驱动器列表框Drivel,亦设其Visible属性为FALSE,以使窗体和列表框在程序调
入时不被显示出来。其它属性均取默认值。
    ②双击窗体,编写过程代码
Private Sub Form-Load()
On Error GoTo finderr ′检查光驱是否准备好或光驱中是否为VCD光碟
startline:
drvnmb=Drive1ListCount
cdname$=Drive1List(drvnmb-1)
files$=Dir$(cdname$ & "\mpegav\*.dat")
If files$=""Then GoTo finderr
act=Shell("C:\Program Files\Xmplayer\XMPLAYER.EXE",1)
′假定Xmplayer位于该目录,打开并使之获得焦点
SendKeys "%(fv)",True ′模拟Ctrl+fv键盘动作,开始播放VCD
PauseTime=2 ′一些VCD光碟因制作不规范,播放前会提示有一些错误,为对这些
错误作出处理,所以暂停若干秒,此暂停是在后台进行,不影响正常 VCD连续播放

start=Timer
Do While Timer<start+PauseTime
Loop
SendKeys"{enter},^s,^p,^{f4},%{esc},^4",True ′模拟其
它键盘动作,满屏播放,隐藏面板等
End
finderr:
msg$="光驱未准备好,或光驱中非VCD光盘,将光驱准备好,"
msg$=msg$ & "或换一张光盘,然后回车重试,或按取消退出"
er=MsgBox(msg$,53,"出错提示")
If er=4 Then Resume startline Else En ′由用户选择重试或退出
End Sub
    ③将上述程序编译成EXE文件,然后将其快捷方式拖至桌面,双击该图标,即
可装入Xing MPEG Player并自动开始满屏播放VCD,同时置PLAYER面板于
Standard Bar状态,并将之隐藏。程序中^表示Ctrl,%表示Alt,之所以程序中
要连续插入暂停“^S”和播放“^P”两个动作,是因为20版本的VCD在按Alt+
FV后即开始播放, 10版本在按Alt+FV后还要求按Ctrl+P,而Ctrl+P在播放状
态下又等价于Ctrl+S(即暂停),所以如果只有一个“^P”则使VCD10开始播
放而VCD20暂停,为了兼顾两种版本的VCD,首先模拟Ctrl+S动作实现暂停,然
后再模拟 Ctrl+P开始播放,从而使两种版本的 VCD在执行本程序后都能实现自动
播放。
    上述程序在PWIN95、VISUAL BASIC 4.0和XingMPEG PLAYER 3.2环境中调试通
过。



如何播放 .wav 声音文件?
利用多媒体的 mciSendString API 函数, 再搭配 mci(multimedia control
interface) 指令, 即可播放 .wav 声音文件, 细节如下:
1. API 的声明:
Private 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
注:如果以上的声明放在「一般模块」底下, 应将 Private 保留字去掉。
2. 程序范例:
' 撰写播放声音的一副程序
Sub PlaySound(filename)
    Dim cmd As String
    Call mciSendString("close MyWav", 0, 0, 0) ' MyWav 这个名称可依需要
来修改
    cmd = "open " & filename & " type WAVEAudio alias MyWav"
    Call mciSendString(cmd, 0, 0, 0)
    Call mciSendString("play MyWav", 0, 0, 0)
End Sub
' 假设要拨放 "c:\windows\Tada.wav"
PlaySound "c:\windows\Tada.wav"



如何连续播放 .wav 声音文件?
叁考 上一技巧, 并且在表单上布置一个 Timer 控制文件、将 Interval 属性设
定成 100(表示 0.1 秒), 然后撰写 Timer1_Timer 事件程序,如下:
Private Sub Timer1_Timer()
    Dim retStr As String * 80
    Call mciSendString("status MyWav mode", retStr, 80, 0)
    If Left(retStr, 7) = "stopped" Then ' 如果停止了
        PlaySound "c:\windows\Tada.wav" ' 重复播放
    End If
End Sub


如何播放 .flc 动画档?
播放 .flc 动画文件的方法与 .wav 及 .midi 并没有什么不同,最后完成的程序
大致如下:
Sub PlaySound(filename)
    Dim cmd As String
    Call mciSendString("close MyFlc", 0, 0, 0) ' MyFlc 这个名称可依需要
来修改
    cmd = "open " & filename & " alias MyFlc"
    Call mciSendString(cmd, 0, 0, 0)
    Call mciSendString("play MyFlc", 0, 0, 0)
End Sub
注:有些机器可能会因为没有安装 .flc 的驱动程序而无法播放,欲检查机器中是
否安装有播放 .flc 的驱动程序, 可先利用 Windows 提供的媒体播放程序播放
.flc 文件看看。


如何将 .flc 动画档放在某一个 hWnd 之中播放?
上一技巧, 会开启独立的窗口来播放 .flc 动画档, 如何将它放在某一个
Form 或 PictureBox 之中播放?
假设我们想将 .flc 放在 Picture1 之中播放, 则必须将 open MCI 指令由原先
的:
"open " & filename & " alias MyFlc"
改成:
"open " & filename & " alias MyFlc parent " & Picture1.hWnd & " style
" & WS_CHILD
则 .flc 就会在 Picture1 之中播放。
注:WS_CHILD 等于 &H40000000。


--

                    ^_^忍一时风平浪静,退一步海阔天空~!^_^
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.32.165]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店