VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用VB实现特殊图形效果
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11967, 日期:2002-03-14
用VB实现特殊图形效果
◆ 新乡师范高等专科学校 牛丽萍



引言 在PowerPoint这样的软件中,各种各样的图形特效层出不穷,如百叶窗式、飞入式、关门式、棋 盘式等等,在VB中也是可以实现这样的效果的,而且十分简单,其方法是调用Windows的API函数 BitBlt。 BitBlt函数简介 BitBlt函数在API函数群中是个很重要的角色,尤其在图像处理方面,更是不可或缺。其原意 是“Bit Block Transfer”,用途是位图的复制。用Bitblt函数显示图形特效,其原理十分简单,在窗 体上绘制两个图片框,将图片存入一个图片框,同时令另一个为空,然后调用Bitblt函数将第一个图 片框中的图形一部分一部分地复制到第二个图片框中,这样就可以实现千奇百怪的图形特效了。 使用BitBlt函数应先在模块中进行如下声明: 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  各参数含义如下: 参数 含义 hDestDC 目标设备环境的handle(hDC)  X,Y 欲复制图形放置在目标设备 环境的位置(左上角坐标) nWidth 欲复制图形的宽度 nHeight 欲复制图形的高度 hSrcDc 源设备环境的hDC  xSrc,ySrc 从源图形的(xSrc,ySrc)坐 标处开始复制 dwRop 图形从源设备环境复制到目标 设备环境时所做的逻辑运算。 总共有15种运算码,通常使用 SRCCOPY(&HCC0020),表 示直接复制。 实现完美的图片显示效果 新建一窗体Form1和一模块Module1,在窗体上添加两个图片框Picture1、Picture2和一个按钮 Command1,Picture1中加载任一图片,Picture2为空,为按钮编程以达到点击按钮,此图片在Picture2 中以下述任一效果出现。 1.左进入效果 其原理是将源图形的像素元素,一列一列地复制到目标区域,配合稍许的时间延迟及数据复制的 方向,从屏幕上看好像图形从左边进入图片框中。改变delay()函数中的参数可改变程序运行时 间。据此可制作“从下进入”、“从上进入”、“从右进入”等效果。 2.水平百叶窗效果 其原理是事先将图形分割成几部分,每一部分都单独传输给目标图像,传输的方式采用“值 差”式, 即先传输第一部分第一块,第二部分第一块……再传输第一部分第二块,第二部分第二块……直 到图形出来为止,从屏幕上看好像是门帘逐渐反转显示一样。据此可做出“垂直百叶窗”等效果。 3.负片效果 其原理是把图形逐点复制,只是把复制的方式改为“NOTSRCCOPY”,从屏幕上看好像是图片的负 片一样。 4.拉伸效果 其原理是开始把图形的宽度方向压缩成很窄的矩形,高度方向与原图像保持一致,然后逐步放大 以接近原图片的宽度,从屏幕上看好像把图片拉伸了一样。 以下是部分源程序清单: Private Sub Command1_Click()  Const SRCCOPY = &HCC0020  Const NOTSRCCOPY = &H330008  Dim i, j, w, h As Integer  Dim dtime, effect, scanline As Integer  Dim source, dest  dtime = 20000  w = Picture1.ScaleWidth  h = Picture1.ScaleHeight  source = Picture1.hDC  dest = Picture2.hDC  effect = Int(5 * Rnd)  Picture2.Cls  Select Case effect  Case 0: ’从左进入效果 For i = 0 To w  call BitBlt(dest, 0, 0, i, h, source, 0, 0, srccopy)  delay dtime * 3  Next  Case 1: ’左上角飞入效果 For i = 0 To w  Call BitBlt(dest, 0, 0, i, h * (i / w), source, 0, 0, srccopy)  delay dtime * 3  Next  Case 2: ’水平百叶窗效果 scanline = 10  For i = 0 To (scanline - 1)  For j = i To w Step scanline  Call BitBlt(dest, j, 0, 1, h, source, j, 0, srccopy)  delay dtime * 2  Next  delay 10 * dtime  Next  Case 3: ’负片效果 Call BitBlt(dest, 0, 0, w, h, source, 0, 0, notsrccopy)  Case 4: ’拉伸效果 For i = 0 To 100  For j = w To 0 Step -1  Call BitBlt(dest, j * i / 100, 0, 1, h, source, j, 0, srccopy)  Next  Next  End Select  End Sub  Public Sub delay(dtime As Long)  Dim i As Long  For i = 0 To dtime  Next i  End Sub  图片出现的效果还有很多,由于篇幅所限,就不在这里叙述了。只要您灵活地应用以上方法,一 定还能产生更多更美的图片效果。这些风格各异的图片效果必定会为您的VB程序增添美丽的情调, 使您的程序更富魅力、更专业。 (以上程序在VB 6.0下调试通过)