VB5.0中基于桌面的屏幕技巧
- 日期:2007-10-20 人氣:
13 出處: 作者:
->----WINDOWS95的桌面是用戶的一個主要工作場所,如果你能使這個桌面移動起來或者發(fā)生其它變化,將是一種別具一格屏幕特技效果,而實際上目前具有類似效果的程序并不少見,比如MicrosoftPLUS!中提供的一種屏幕保護(hù)程序,下面介紹在VB5.0中實現(xiàn)桌面變化特技的基本原理和具體操作過程。
----一,、桌面變化的實質(zhì):這種編程效果的奧妙在于,它不是使真正的WINDOWS95桌面發(fā)生了變化,而是啟動了一個具有黑色背景的且運(yùn)行在最大化模式下的應(yīng)用程序,在這個程序中復(fù)制了一張和桌面完全一樣的圖像,覆蓋在整個桌面之上,通過一些特殊的操作使這幅圖像在黑色的背景下發(fā)生扭曲,、移動等動作,當(dāng)結(jié)束此程序時,自然恢復(fù)到原來的桌面狀態(tài),整個過程連貫進(jìn)行,即可以給人一種桌面發(fā)生變化的假象。
----二,、基本實現(xiàn)原理:首先必須通過有關(guān)的WINDOWSAPI函數(shù),取得桌面窗口的句柄,然后把此桌面圖像放入與屏幕尺寸相同的圖形框或其它圖形容器控件之中,然后以此為圖像源,利用其它圖形控件或有關(guān)的圖像處理函數(shù),靈活地控制這幅圖像,使之產(chǎn)生特殊的屏幕效果,。編程時需要使用下面幾個API函數(shù):
----BitBlt:一個較常見的圖像處理函數(shù),完成圖像的復(fù)制工作;
----GetDC:獲得窗口的描述表句柄;
----GetDesktopWindow:返回桌面窗口句柄;
----ReleaseDC:釋放窗口描述表;
----具體的參數(shù)格式及使用方法見后面的程序代碼。
----這里還需要使用一個VB內(nèi)部函數(shù)PaintPicture,語法格式:
PaintPicturePic,destX, destY,destWidth,destHeight, scrX,scrY,scrWidth,scrHeight 其中Pic:為圖片對象, 如圖形框Picture等; destX,destY:目標(biāo)圖像位置; destWidth,destHeight:目標(biāo)圖像尺寸; scrX,scrY:原圖像的裁剪坐標(biāo); scrWidth,scrHeight:原圖像的裁剪尺寸;
----此命令的功能就是把一個源圖像資源任意復(fù)制到指定的區(qū)域,其功能相當(dāng)于API函數(shù)的BitBlt,但使用更為簡單,。
----其中有一點(diǎn)需要說明,在VB通常有兩種圖形控件可以使用,即圖形框PICTURE及圖像框IMAGE,其中PICTURE具有與窗體通用的Hdc句柄屬性,所以可方便的進(jìn)行圖像復(fù)制,而IMAGE最大的優(yōu)點(diǎn)是具有Stretch伸縮性,可方便的進(jìn)行圖像的縮放處理,所以在編程時會涉及到把圖像從圖形框PICTURE復(fù)制到圖像框IMAGE的動作,這里需要澄清圖形框PICTURE的兩個相似的屬性即PICTURE及IMAGE,比如一般可用下面的命令在圖形框中裝入圖像:
----Picture1.picture=Loadpicture("c:\windows\setup.bmp")
----此時可用下面的命令把圖像復(fù)制到圖像框中:
----SetImage1.picture=Picture1.Picture
----而利用BitBlt命令復(fù)制到Picture中的圖像則不是它的Picture屬性,使用上述的復(fù)制命令將無法得到真實的圖像,而必須使用其Image屬性,AutoRedraw屬性可以引起Image改變,,Image是指向位圖的句柄,當(dāng)AutoRedraw為True時,對象的hDC屬性成為指向設(shè)備描述體的句柄,,復(fù)制命令為:
----SetImage1.Picture=Picture1.Image
----同樣,在針對上述的Picture兩種不同的裝入圖像方法,使用圖像重寫命令PaintPicture也需要兩種不同的方法:
----PaintPicturePicture1.Image,x,y,Width,Height
----PaintPicturePicture1.Picture,x,y,Width,Height
----三,、一個演示程序的編制過程
----創(chuàng)建一個新的工程,在窗體Form1上放置一個圖形框Picture1和一個圖像框Image1,置Form1及Picture1的AutoReadraw屬性為True,置form1的BorderStyle屬性為None,背景BackColor為黑色,如果想要任務(wù)條安全地參加特技運(yùn)動,最好使程序運(yùn)行在最大化模式,即置Form1的WIndowState屬性為Maximized。然后進(jìn)行API函數(shù)說明,可通過APIViewer直接獲得,把其放入一個BAS模塊文件中,也可以直接放在窗體Form1代碼文件的General段中,但此時在函數(shù)前面必須加上Private關(guān)鍵字,詳見下面的API說明,最后文后程序代碼填入有關(guān)的事件之中,。此演示程序運(yùn)行之后可實現(xiàn)下面的桌面特技效果,任何時候單擊圖形框可強(qiáng)制退出程序:
----1.桌面逐漸縮小:圖形的放大縮小使用Image控件最為方便,實現(xiàn)此特技的關(guān)鍵處就是需要把桌面圖形傳遞到圖像框IMAGE之中,然后置Stretch屬性為真,逐漸修改IMAGE的尺寸即可使桌面放大或縮小,;
----2.隨機(jī)位置顯示桌面:此效果主要使用PaintPicture命令,通過隨機(jī)修改目標(biāo)圖形的起始坐標(biāo),把桌面圖像寫到屏幕的隨機(jī)位置;
----3.桌面的橫向或縱向滾動:此效果只需要把桌面圖形寫到一個圖形框Picture之中,然后通過修改此圖形框的起始坐標(biāo),即可以使桌面在屏幕上發(fā)生平滑滾動;
----4.桌面上顯示文字或圖形:此效果主要使用VB的繪圖方法及Print命令,在VB中窗體或圖形框均支持VB繪圖方法,下面的程序中先畫兩個重疊的實心矩形,然后在其上面顯示文字,最終形成帶有背景和邊框的字符串;
----5.桌面變暗:桌面變暗的效果在你關(guān)閉WINDOWS95時即可見到,在VB中要使圖形亮度降低并不件容易的事,需要多個API函數(shù)及復(fù)雜的編程,但可通過一種顏色抖動的方法解決,即在桌面圖形上均勻的寫上黑色象素,可使圖形產(chǎn)生明顯的降低亮度的感覺,。
----由于這個演示程序是連續(xù)演示上述五種特技,其效果顯得不太理想,如果你單獨(dú)使用其中的一種處理方法,即在正常的桌面狀態(tài)下直接使桌面變化,將更為理想。以上給出了用VB對WINDOWS95桌面進(jìn)行特殊操作的原理和方法,實際上利用這個原理加入VB中靈活的圖像處理手段,可以實現(xiàn)對桌面更為復(fù)雜的其它控制效果,比如可制作完整的屏幕保護(hù)程序,有興趣的讀者可以一試,以上程序在WINDOWS95系統(tǒng)、VB5.0環(huán)境下調(diào)試通過,。
----附源程序清單:
----'API函數(shù)引用
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 '隨機(jī)位置顯示桌面 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 '強(qiáng)制退出程序 PrivateSubPicture1_Click() End EndSub->
->
|