




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、API实现完美的图片出现效果作者:罗玉强 在用Visual Basic编程的时候,通常要调用图片,如果图片出现的时候是以各种完美的效果出现的,(如马赛克效果,百叶窗效果等)则你的程序就会显得更加灵活,你的程序就会更加专业化。本文讲述了Visual Basic中如何调用API函数,以及用API函数中的BitBlt函数实现各种完美的图片出现效果的过程。 1 一般的图片出现效果 一般情况下,要使Visual Basic中的图片出现,例如,要显示Picture1中的图片,只需一句代码: Picture1.Visible=True 使用以上方法时,图片是突然出现的。也可以编复杂一点的代码,使图片从左到右
2、、从上到下或从中间向四周扩大。例如,使Picture1中的图片从左到右出现,其代码为: Picture1.Width = 0 Picture1.Visible = True For i = 0 To 5000 Step 50 注释:5000代表图片的高度 Picture1.Width = i Next i 使Picture1中的图片从上到下出现的代码为: Picture1.Height = 0 Picture1.Visible = True For i = 0 To 4000 Step 40 注释:4000代表图片的宽度 Picture1.Height = i Next i 使Picture1
3、中的图片从中间向四周扩大的代码为: Picture1.Width = 0 Picture1.Height = 0 Picture1.Visible = True For i = 0 To 100 Picture1.Width = Picture1.Width + 50 Picture1.Height = Picture1.Height + 40 Picture1.Left = Picture1.Left - 100 Picture1.Top = Picture1.Top - 80 Next i 当然,你可以灵活地应用以上办法实现其他更加好看的图片出现效果。然而,同Authorware等其他软件
4、编制的程序相比,你的图片出现效果仍然会黯然失色,因为Authorware编程时,可以很容易地实现从上到下、从左到右、百叶窗、开门、关门等完美的图片出现效果,要在Visual Basic中做到这些效果并非易事。 但“天无绝人之路”,强大的Windows API函数中的BitBlt函数将帮助您实现这一愿望。 2 BitBlt函数 一、 BitBlt函数的功能 BitBlt API函数的功能是将屏幕上任何一块拷贝到屏幕上其它任何一个地方。 二、 声明BitBlt函数 1. 运行Visual Basic4.0程序组中的API Text Viewer程序项。 2. 在API Text Viewer中,单
5、击File菜单下的Load Text File.命令。 3. 在出现的Select a Text API File对话框中,选择Win32api.txt文件。 4. 为了使以后拷贝Windows API函数更快,你可以将Win32api.txt文件转换成为一个数据库。如图,单击“是(Y)”。 5. 在API Type下拉框中选择Declare。 6. 在Available Items中选择BitBlt,如图,单击Add按纽,于是BitBlt便出现在Selected Items框中,单击Copy按纽。BitBlt函数变拷贝到剪贴板上。 7. 关闭API Text Viewer,打开Visual
6、Basic程序,使用Insert菜单下的Module命令新建一个Module1,使用Edit菜单下的Paste命令,将剪贴板上的BitBlt函数拷贝到Module1中。这样,在您的程序中,就可以使用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
7、Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 以上是BitBlt函数的声明格式,其中,各参数定义如下: 参数 描述 hDestDC 接收位图的设备描述表 X 目标矩形左上角的逻辑X坐标 Y 目标矩形左上角的逻辑Y坐标 nWidth 目标矩形的宽度 nHeight 目标矩形的高度 hSrcDC 源设备描述表 xSrc 源位图左上角的逻辑X坐标 ySrc 源位图左上角的逻辑Y坐标 dwRop 拷贝模式 dwRop的各种可能值为: &HCC0020 dest=source &HEE0086 dest=source OR dest &H8
8、800C6 dest=source AND dest &H dest=source XOR dest &H dest=source AND (NOT dest) &H dest=not source &H1100A6 dest=(NOT source)AND(NOT dest) &HC000CA dest=source AND pattern &HBB0226 dest=(NOT source) OR dest &HF00021 dest=pattern &HFB0A09 dest=Dpsnoo &H5A0049 dest=pattern XOR dest &H dest=NOT dest &
9、H42& dest=BLACK &HFF0062 dest=WHITE 在本程序中使用的BitBlt函数均定义dwRop=HCC0020,如果你定义dwRop为其他值,会收到其他异想不到的效果。 3 用BitBlt函数实现各种各样的图片出现效果 实现髦滞计鱿中幕驹硎牵荷柚昧礁鐾计騊icture1和Picture2,在Picture1中装入要显示的图片,(可以在窗体设计时就装好,也可以在程序运行过程中装入。)将Picture1中的图片以各种方法拷贝到Picture2中,从而实现各种各样的图片出现效果。 先在Picture1中装入待显示的图片,并设置Picture1的属性为AutoRedraw=T
10、rue,Visible=False, 设置Picture2的属性为AutoRedraw=False,Visible=True,设置Form的属性为ScaleMode=3。 一、从上到下效果 将Picture1从形式上分为很多小块 如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多小块a1、a2、a3、,每块宽度为。 然后利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的相同位置,等待片刻,再拷贝a2块、a3块、直到。如果将取得足够小,则人眼看到 Picture2中的图片就是以从上到下的效果出现的。其程序如下: Pi
11、cture2.Cls nHeight = 3小块的高度,即 Stripes = Picture1.Height / nHeight总共的小块数目n个 P2 = nHeight P1 = Picture1.Width For I = 0 To Picture1.Height Step nHeight p3 = I r% = BitBlt(Form1.Picture2.hDC, 0, p3, P1, P2, Form1.Picture1.hDC, 0, p3, &HCC0020) For j = 1 To 8000注释:等待片刻,图片从上到下出现的时间可以由此调节 Next Next 明白了以上制
12、作原理以后,图片从下到上、从做到右、从右到左出现的效果也就可以实现了。 二、开门效果 开门效果的制作也是先将Picture1从形式上划分为很多小块a1、a2、a3、,每块宽度为。如图。 然后利用BitBlt函数先将Picture1中的a0块拷贝到Picture2中的相同位置,等待片刻,再拷贝a1块、a2块、直到。如果将取得足够小,则人眼看到 Picture2中的图片就是以开门的效果出现的。其程序如下: Picture2.Cls nWidth = 3小块的宽度,即 Stripes = Picture1.Width / nWidth总共的小块数目n个 P2 = Picture1.Height P1
13、 = nWidth For I = Picture1.Width / 2 + nWidth To 0 Step -nWidth p3 = I p4 = Picture1.Width - I r% = BitBlt(Form1.Picture2.hDC, p3, 0, P1, P2, Form1.Picture1.hDC, p3, 0, &HCC0020) r% = BitBlt(Form1.Picture2.hDC, p4, 0, P1, P2, Form1.Picture1.hDC, p4, 0, &HCC0020) For j = 1 To 8000等待片刻,图片开门效果出现的时间可以由此
14、调节 Next Next 根据同样的方法可以制作“上下开门”、“左右关门”、“上下关门”、“从中间向四周扩大”、“从四周向中间缩小”等效果。 三、百叶窗效果 分成几个大块,每个大块分成很多个小块 如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多宽度为的大块,然后再将每一块进一步划分为宽度为的若干小块。 然后利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的相同位置,再拷贝b1块、c1块、却蹋倏奖碼2块、b2块、c2块、。如果将取得足够小,则人眼看到 Picture2中的图片就是以百叶窗的效果出现的。其程序如下:
15、Picture2.Cls nWidth = 3 mWidth = 18 Stripes = Picture1.Width / nWidth P2 = Picture1.Height P1 = nWidth For j = 0 To mWidth Step nWidth For I = 0 To Picture1.Width + nWidth Step mWidth p3 = I + j r% = BitBlt(Form1.Picture2.hDC, p3, 0, P1, P2, Form1.Picture1.hDC, p3, 0, &HCC0020) Next For k = 1 To Nex
16、t Next 根据同样的道理,可以制作上下百叶窗效果。 四、逐段翻开效果 分成几个大块,每个大块分成很多个小块 如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多宽度为的大块,然后再将每一块进一步划分为宽度为的若干小块。 然后利用BitBlt函数先将Picture1中的a0块拷贝到Picture2中的相同位置,再拷贝a1块、a2块、。等待片刻,再拷贝b0块、b1块、b2块、。如果将取得足够小,则人眼看到 Picture2中的图片就是以逐段翻开的效果出现的。其程序如下: stripewidth = 40 Stripes = Picture1.
17、ScaleWidth / stripewidth P2 = Picture1.ScaleHeight For i = 0 To (Stripes - 1) / 10 Step 1 For m = 0 To stripewidth / 2 r% = BitBlt(Picture2.hDC, P1 + m + stripewidth / 2 + i * stripewidth, 0, 2, P2, Picture1.hDC, P1 + m + stripewidth / 2 + i * stripewidth, 0, &HCC0020) r% = BitBlt(Picture2.hDC, P1 -
18、 m + stripewidth / 2 + i * stripewidth, 0, 2, P2, Picture1.hDC, P1 - m + stripewidth / 2 + i * stripewidth, 0, &HCC0020) For j = 1 To 10000 Next j Next m For j = 1 To 50000 Next j Next i 五、逐段进入效果 将Picture1从形式上划分为很多宽度为的大块 a1块在Picture2中的位置 a1块在Picture2中的位置前进了 逐段进入效果的制作要麻烦一些,要将Picture1中的图片拷贝到Picture2中,
19、首先将Picture1从形式上划分为很多宽度为的大块a1、a2、a3、。 利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的最右边,如图(2),等待片刻,将Picture2中的图片清除掉,然后将Picture1中的a1块拷贝到Picture2中的距离最右边处。如图(3),a1块好象向左前进了,如此下去,就可以实现a1块从左进入,使用同样的办法使a2块、a3块、依次逐渐进入。这样,人眼看到 Picture2中的图片就是以逐段进入的效果出现的。其程序如下: Picture2.Cls nWidth = 50 Stripes = Picture1.Width / nWidth
20、 P2 = Picture1.Height P1 = nWidth For I = 0 To Picture1.Width + nWidth Step nWidth p3 = I For k = Picture1.Width To I Step -nWidth p4 = k Picture2.Cls r% = BitBlt(Picture2.hDC, 0, 0, I, P2, Picture1.hDC, 0, 0, &HCC0020) r% = BitBlt(Picture2.hDC, p4, 0, P1, P2, Picture1.hDC, p3, 0, &HCC0020) For j =
21、1 To 注释:Wait For A While Next j Next k Next i 必须指出,以上逐段进入的效果有一个明显的缺点,就是有“闪动”现象。产生这种现象的原因是由于程序不停地删除、不停地拷贝同一块造成的。如果不删除而只拷贝,则不会出现“闪动”现象。 六、马赛克效果 马赛克效果在很多软件中都有应用,其原理是将Picture1从形式上划分为很多小块,如图所示,一共有n块。然后利用BitBlt函数将Picture1中的小块随机地拷贝到Picture2中的相同位置处。 你不能简单地产生一个随机数,然后将这个随机数的值所对应的那一小块图片拷到Picture2中。因为随机数是随机的,所以有可能某些数重复出现,而某些数很久甚至始终未出现。这就造成Picture2中有些块被重复拷贝,而有些块始终未出现。另外,在随机拷贝的后阶段,随机数与以前重复的概率越来越大,这就造成新块出现的时间越来越慢,达不到理想的马赛克效果。 解决的办法是先产生一个随机系列。用一维数组 B(n)记录n个随机值,每一个随机值都在n以内,且各不相同。然后按顺序将B(n)中的随机值读出,并根据这个随机值拷贝对应的图片块。这样,新块出现的速度才能做到均匀,而且保证每个图片块都能出现,从而达到非常完美的马赛克效果。 Dim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商标使用权转让合同(三):长期合作
- 简易劳动合同简易合同
- 合同纠纷处理与学生实践活动方案
- 水运联运代理合同及条款
- 钢结构加工承揽合同模板
- 林业用地承包转让合同样本
- 大学合同审签表
- 抽纱工艺的环保与可持续性考核试卷
- 天然气开采业的可再生能源转型实践与方案考核试卷
- 机床附件的标准化与规范化生产考核试卷
- 家校共育之道
- DeepSeek入门宝典培训课件
- 西安2025年陕西西安音乐学院专职辅导员招聘2人笔试历年参考题库附带答案详解
- 《作文中间技巧》课件
- 广东省2025年中考物理仿真模拟卷(深圳)附答案
- 2025届八省联考 新高考适应性联考英语试题(原卷版)
- 新苏教版一年级下册数学第1单元第3课时《8、7加几》作业
- 2024年山东电力高等专科学校高职单招职业技能测验历年参考题库(频考版)含答案解析
- 《平面广告赏析》课件
- 人教鄂教版六年级下册科学全册知识点
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
评论
0/150
提交评论