->----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.Left>Screen.WidthThen
Picture1.Left=-Screen.Width
EndIf
DoEvents
Nexti
'縱向移動
Fori=0ToScreen.Height*2/5
Picture1.Top=Picture1.Top 5
IfPicture1.Top>Screen.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->->