【 tulaoshi.com - 编程语言 】
->----WINDOWS95的桌面是用户的一个主要工作场所,如果你能使这个桌面移动起来或者发生其它变化,将是一种别具一格屏幕特技效果,而实际上目前具有类似效果的程序并不少见,比如MicrosoftPLUS!中提供的一种屏幕保护程序,下面介绍在VB5.0中实现桌面变化特技的基本原理和具体操作过程。
----一、桌面变化的实质:这种编程效果的奥妙在于,它不是使真正的WINDOWS95桌面发生了变化,而是启动了一个具有黑色背景的且运行在最大化模式下的应用程序,在这个程序中复制了一张和桌面完全一样的图像,覆盖在整个桌面之上,通过一些特殊的操作使这幅图像在黑色的背景下发生扭曲、移动等动作,当结束此程序时,自然恢复到原来的桌面状态,整个过程连贯进行,即可以给人一种桌面发生变化的假象。
----二、基本实现原理:首先必须通过有关的WINDOWSAPI函数,取得桌面窗口的句柄,然后把此桌面图像放入与屏幕尺寸相同的图形框或其它图形容器控件之中,然后以此为图像源,利用其它图形控件或有关的图像处理函数,灵活地控制这幅图像,使之产生特殊的屏幕效果。编程时需要使用下面几个API函数:
----BitBlt:一个较常见的图像处理函数,完成图像的复制工作;
----GetDC:获得窗口的描述表句柄;
----GetDesktopWindow:返回桌面窗口句柄;
----ReleaseDC:释放窗口描述表;
----具体的参数格式及使用方法见后面的程序代码。
----这里还需要使用一个VB内部函数PaintPicture,语法格式:
PaintPicturePic,destX,
destY,destWidth,destHeight,
scrX,scrY,scrWidth,scrHeight
其中Pic:为图片对象,
如图形框Picture等;
destX,destY:目标图像位置;
destWidth,destHeight:目标图像尺寸;
scrX,scrY:原图像的裁剪坐标;
scrWidth,scrHeight:原图像的裁剪尺寸;
----此命令的功能就是把一个源图像资源任意复制到指定的区域,其功能相当于API函数的BitBlt,但使用更为简单。
----其中有一点需要说明,在VB通常有两种图形控件可以使用,即图形框PICTURE及图像框IMAGE,其中PICTURE具有与窗体通用的Hdc句柄属性,所以可方便的进行图像复制,而IMAGE最大的优点是具有Stretch伸缩性,可方便的进行图像的缩放处理,所以在编程时会涉及到把图像从图形框PICTURE复制到图像框IMAGE的动作,这里需要澄清图形框PICTURE的两个相似的属性即PICTURE及IMAGE,比如一般可用下面的命令在图形框中装入图像:
----Picture1.picture=Loadpicture("c:windowssetup.bmp")
----此时可用下面的命令把图像复制到图像框中:
----SetImage1.picture=Picture1.Picture
----而利用BitBlt命令复制到Picture中的图像则不是它的Picture属性,使用上述的复制命令将无法得到真实的图像,而必须使用其Image属性,AutoRedraw属性可以引起Image改变,Image是指向位图的句柄,当AutoRedraw为True时,对象的hDC属性成为指向设备描述体的句柄,复制命令为:
----SetImage1.Picture=Picture1.Image
----同样,在针对上述的Picture两种不同的装入图像方法,使用图像重写命令PaintPicture也需要两种不同的方法:
----PaintPicturePicture1.Image,x,y,Width,Height
----PaintPicturePicture1.Picture,x,y,Width,Height
----三、一个演示程序的编制过程
----创建一个新的工程,在窗体Form1上放置一个图形框Picture1和一个图像框Image1,置Form1及Picture1的AutoReadraw属性为True,置form1的BorderStyle属性为None,背景BackColor为黑色,如果想要任务条安全地参加特技运动,最好使程序运行在最大化模式,即置Form1的WIndowState属性为Maximized。然后进行API函数说明,可通过APIViewer直接获得,把其放入一个BAS模块文件中,也可以直接放在窗体Form1代码文件的General段中,但此时在函数前面必须加上Private关键字,详见下面的API说明,最后文后程序代码填入有关的事件之中。此演示程序运行之后可实现下面的桌面特技效果,任何时候单击图形框可强制退出程序:
----1.桌面逐渐缩小:图形的放大缩小使用Image控件最为方便,实现此特技的关键处就是需要把桌面图形传递到图像框IMAGE之中,然后置Stretch属性为真,逐渐修改IMAGE的尺寸即可使桌面放大或缩小;
----2.随机位置显示桌面:此效果主要使用PaintPicture命令,通过随机修改目标图形的起始坐标,把桌面图像写到屏幕的随机位置;
----3.桌面的横向或纵向滚动:此效果只需要把桌面图形写到一个图形框Picture之中,然后通过修改此图形框的起始坐标,即可以使桌面在屏幕上发生平滑滚动;
----4.桌面上显示文字或图形:此效果主要使用VB的绘图方法及Print命令,在VB中窗体或图形框均支持VB绘图方法,下面的程序中先画两个重叠的实心矩形,然后在其上面显示文字,最终形成带有背景和边框的字符串;
----5.桌面变暗:桌面变暗的效果在你关闭WINDOWS95时即可见到,在VB中要使图形亮度降低并不件容易的事,需要多个API函数及复杂的编程,但可通过一种颜色抖动的方法解决,即在桌面图形上均匀的写上黑色象素,可使图形产生明显的降低亮度的感觉。
----由于这个演示程序是连续演示上述五种特技,其效果显得不太理想,如果你单独使用其中的一种处理方法,即在正常的桌面状态下直接使桌面变化,将更为理想。以上给出了用VB对WINDOWS95桌面进行特殊操作的原理和方法,实际上利用这个原理加入VB中灵活的图像处理手段,可以实现对桌面更为复杂的其它控制效果,比如可制作完整的屏幕保护程序,有兴趣的读者可以一试,以上程序在WINDOWS95系统、VB5.0环境下调试通过。
----附源程序清单:
----'API函数引用
PrivateDeclareFunctionBitBlt
Lib"gdi32"(ByValhDestDCAsLong,
ByValXAsLong,ByValYAs
Long,ByValnWidthAsLong,
ByValnHeightAsLong,ByVal
hSrcDCAsLong,ByValxSrcAsLong,
ByValySrcAsLong,ByVal
dwRopAsLong)AsLong
PrivateDeclareFunctionGetDC
Lib"user32"(ByValhwndAsLong)AsLong
PrivateDeclareFunctionGet
DesktopWindowLib"user32"()AsLong
PrivateDeclareFunctionReleaseDC
Lib"user32"(ByValhwndAsLong,
ByValhdcAsLong)AsLong
'变量说明
DimsWnd,sDC,hd
'直接演示特技效果
PrivateSubForm_Load()
'置窗口背景为黑色无边框
'Form1.BackColor=0
'Form1.BorderStyle=0
'修改窗口尺寸与屏幕相同
Form1.AutoRedraw=True
Form1.Width=Screen.Width
Form1.Height=Screen.Height
Form1.Top=0
Form1.Left=0
'修改PICTURE尺寸与屏幕相同
Picture1.Width=Screen.Width
Picture1.Height=Screen.Height
Picture1.Top=0
Picture1.Left=0
'获得桌面图像句柄
sWnd=GetDesktopWindow()
sDC=GetDC(sWnd)
hd=BitBlt(Picture1.hdc,0,0,Form1.
Width,Form1.Height,sDC,0,0,&HCC0020)
hd=ReleaseDC(sWnd,sDC)
Picture1.Visible=False
Form1.Show
'修改IMAGE尺寸与屏幕相同
Image1.Stretch=True
Image1.Picture=Picture1.Image
Image1.Width=Screen.Width
Image1.Height=Screen.Height
Image1.Top=0
Image1.Left=0
'桌面逐渐缩小
Fori=0ToScreen.Height/35
Image1.Visible=False
Image1.Top=15*i
Image1.Left=15*i
Image1.Width=Screen.Width-2*Image1.Left
Image1.Height=Screen.Height-2*Image1.Top
Image1.Visible=True
DoEvents
Nexti
Image1.Visible=False
'随机位置显示桌面
Fori=0To20
DimllAsInteger
DimttAsInteger
ll=Rnd(1)*Screen.Width-Screen.Width/2
tt=Rnd(1)*Screen.Height-Screen.Height/2
Form1.PaintPicturePicture1.
Image,ll,tt,Screen.Width,Screen.Height
DoEvents
Nexti
'显示PICTURE并清屏幕
Picture1.Visible=True
Form1.Cls
'横向移动
Fori=0ToScreen.Width*2/5
Picture1.Left=Picture1.Left 5
IfPicture1.LeftScreen.WidthThen
Picture1.Left=-Screen.Width
EndIf
DoEvents
Nexti
'纵向移动
Fori=0ToScreen.Height*2/5
Picture1.Top=Picture1.Top 5
IfPicture1.TopScreen.HeightThen
Picture1.Top=-Screen.Height
EndIf
DoEvents
Nexti
'桌面上显示文字
Fori=0To50
WithPicture1
.ScaleMode=3'以象素为单位
.FontTransparent=True
.Font.Size=Rnd*30 10
.Font.Italic=True
.ForeColor=RGB(Rnd*256,Rnd*256,Rnd*256)
.FontName=Screen.Fonts(Rnd*7 14)
EndWith
hh=Picture1.TextHeight("OKDESKTOP演示")
ww=Picture1.TextWidth("OKDESKTOP演示")
X=Rnd*(Picture1.ScaleWidth-ww)
Y=Rnd*(Picture1.ScaleHeight-hh)
Picture1.Line(X-2,Y-2)-(X ww 2,
Y hh 2),RGB(Rnd*256,Rnd*256,Rnd*256),BF
Picture1.Line(X,Y)-(X ww,Y hh),
RGB(Rnd*256,Rnd*256,Rnd*256),BF
Picture1.CurrentX=X
Picture1.CurrentY=Y
Picture1.Print"OKDESKTOP演示"
DoEvents
Nexti
'桌面变暗
Form1.Picture1.ScaleMode=3'以象素为单位
Forj=0ToPicture1.ScaleHeight/2
Picture1.Line(0,2*j)-(Picture1.ScaleWidth,2*j),RGB(0,0,0)
Nextj
EndSub
'强制退出程序
PrivateSubPicture1_Click()
End
EndSub->->