回 帖 发 新 帖 刷新版面

主题:多媒体的编程技巧(1998-1999收集整理)

巧用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色的图形文件。如果你的图像可通过扫描获得,你应将所有图片一次扫描得到一个大图像文件,再将其裁剪成各尺寸相同的小图,这样即可完全避免上述颜色失真现象。
 

回复列表 (共3个回复)

沙发

用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实现图形动画的基本方法,有兴趣的读者可参考有关书目。


 

板凳

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 就使用此方法。


 

3 楼

在图片上平滑移动文字 

    在很多电影及游戏的结尾,你可以看到文本在图片上平滑地卷到屏幕的上方(如电影的版权声明等),在 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


 

我来回复

您尚未登录,请登录后再回复。点此登录或注册