利用VB5.0和WINDOWS95自身所帶的“畫筆”就可以制作出帶有動畫和聲音的屏幕保護程序。畫面是一只蝴蝶在音樂的伴奏下飛動,碰動屏幕的邊緣就會向小球反彈一樣換個方向飛。這裡需要兩個bmp文件,采用的是VB自帶的文件(源文件的位置是c:programfilesdevstduiovbsamplespguidevcrfly1.bmp和bfly2.bmp)。因為蝴蝶要向各個方向飛,所以還要在這兩個文件的基礎上,再制作兩個。打開WINDOWS附件中的“畫筆”,打開bfly1.bmp,點取“畫像”菜單中的“翻轉/旋轉”,選擇“水平翻轉”後,將生成的新文件另存存盤,起名“左飛”,同樣的方法將bfly2.bmp另存為“左合”,將bfly1.bmp改名為“右飛”,bfly2.bmp改名為“右合”(左飛,左合是蝴蝶向左飛時的畫面,右飛,右合是蝴蝶向右飛時的畫面,最後在畫筆中將4個圖的底色都改為黑色,這是保證蝴蝶的底色和屏幕的背景相融合)。
動畫的制作是利用image控件來實現的。改變image的picture屬性可實現畫面的變化,利用move命令可實現畫面的移動。利用MCI控件來實現音樂播放。程序編譯後將生成的exe可執行文件,改為以*.scr結尾的文件名,將其復制到windowssystem子目錄即可,然後就可以在“控制面板”的“顯示器”中選擇該屏幕保護程序即可使用(運行所帶exe文件必須將mid復制到指定的位置。這裡建議使用所帶的setup進行自動安裝,可以省去一切步驟,setup後的文件名為蝴蝶.scr,已自動安裝到系統的文件夾,在“顯示器”中的“屏幕保護程序”可以找到。重新編譯程序所需的4個bmp文件和一個Mid文件也安裝到指定的位置。詳細路徑請見源程序中的說明)。
具體做法如下:首先建立一個新窗體form1,各屬性分別是backcolor選為黑色,borderstyle選為0(黑
色不帶邊框)。在form1上加入7個image控件,在格式菜單中將各個image的大小都選為相同,image1-7的stretch屬性都選為true(圖像將隨控件的大小而變化),image1-6的visible的屬性選為false(不可見),
image7的visible屬性為true。
Image1.picture=右飛Image2.picture=右合
Image3.picture=左飛Image4.picture=左合
在“工程”菜單中選擇“部件”,並從“部件”對話框的“控件”列表中選擇“MicrosoftMultimediaControl5.0”加入MCI控件,並將其visible屬性改為false。加入時鐘控件timer1,其interval屬性為200(interval的值與機器的配置有關,在其他機器上可作適當調整,我的配置是P133,內存為32M)。
原理如下:image1-4用來存圖形,運行時不可見。Image5用來存蝴蝶翅膀張開時的圖像,Image6用來
存蝴蝶翅膀合上時的圖像,運行時都不可見。Image7是唯一運行時可見,利用時鐘控件來改變其圖形,用
Image5和Image6來回變換。
IfImage7.Picture=Image5.PictureThen
Image7.Picture=Image6.Picture
Else
Image7.Picture=Image5.Picture
EndIf
蝴蝶的移動利用image7控件的move方法:
image7.movexp,yp
4個邊界值
上邊:y=0
下邊:y=form1.scaleheight-image7.scaleheight
左邊:x=0
右邊:x=form1.scalewidth-image7.scalewidth
xp,yp為水平和垂直的移動量。
X,y為image7在窗體中的位置
左右邊界的判斷:
Ifx>=form1.ScaleWidth-Image1.WidthThen'右邊界
Image5.Picture=Image3.Picture
'蝴蝶應向左飛,翅膀張開的圖形應選為左飛
Image6.Picture=Image4.Picture
'翅膀合上的圖形應選為左合
x=Form1.ScaleHeight-Image1.Width
'改變x的位置
xp=(-1)*xp
'改變水平的移動量符號,以便向相反方向飛。
EndIf
Ifx<=0Then'左邊界
Image5.Picture=Image1.Picture'右飛
Image6.Picture=Image2.Picture'右合
x=0
xp=(-1)*xp
EndIf
Ify>=Form1.ScaleHeight-Image1.HeightThen
'下邊界
y=Form1.ScaleHeight-Image1.Height
'改變y的位置
yp=(-l)*yp
'改變垂直的移動量符號,以便向相反方向飛
EndIf
Ify<=0Then'上邊界
y=0
yp=(-1)*yp
EndIf
聲音的播出:這裡為播放mid文件
MMControl1.DeviceType=""
MMControl1.Filename="c:mideine.mid"(eine.mid為一mid文件)
MMControl1.Command="open"
MMControl1.Command="play"
這還需利用API函數實現鼠標的隱藏與出現,這裡就不一一介紹了。
部分程序代碼如下(詳細代碼及解釋請見源文件):
DimxAsInteger
DimyAsInteger
DimxpAsInteger
DimypAsInteger
Dimlastx,lasty
privateSubForm1_KeyDown(KeyCodeAsinteger,ShiftAsInteger)
Endscrnsave'結束屏幕保護程序
EndSub
PrivateSubForm1_Load()
Move0,0,Screen.Width,Screen.Height'讓form1全屏顯示
hidemouse'隱藏鼠標
x=l000'蝴蝶的開始位置
y=l000
xp=80'移動量
yp=80
Image5.Picture=Imagel.Picture
'確定翅膀張開的圖形是“右飛”,蝴蝶向右飛
Image6.Picture=Image2.Picture
'確定翅膀合上的圖形是“右合”
Image7.Picture=Image1.Picture
MMControl1.Command="close"'確保MCI控件已關閉
MMControl1.DeviceType=""
'啟動程序就播放mid聲音文件
MMControl1.filename="c:mideine.mid"
MMControl1.Command="open"
MMControl1.Command="play"
EndSub
PrivateSubForm1_MouseMove(ButtonAsinteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfIsEmpty(lastx)OrIsEmpty(lasty)Then
lastx=x
lasty=y
EndIf
IfAbs(lastx-x)>2OrAbs(lasty-y)>2Then
endscrnsave
EndIf
lastx=x
lasty=y
EndSub
PrivateSubForm1_Unload(CancelAsinteger)
MMControl1.Command="close"
UnloadMe
EndSub
PrivateSubTimer1_Timer()
'判斷mid文件是否播放完,如果播放完,進行重播
IfMMControl1.Poesition=895Then
'些mid文件的長度(mid文件的長度,可建立一Label控件,在時鐘控件中令
'Lagel1.caption=mmcontrol1.position,就可動態顯示播放mid
'文件的位置,當mid播放完,就可求出此mid文件的長度。)
MMControl1.Command="prev"
'回到此mid文件的開始位置
MMControl1.Command="play"'播放
EndIf
x=x xp'增加移動量
y=y yp
Ifx>=Form1.ScaleWidth-Image1.WidthThen
'右邊界判斷
Image5.Picture=Image3.Picture'換圖像
Image6.Picture=Image4.Picture
x=Form1.ScaleHeight-Image1.Width
xp=(-1)*xp'改變移動量
EndIf
Ifx<=0Then
Image5.Picture=Image1.Picture
Image6.Picture=Imege2.Picture
x=0
xp=(-1)*xp
EndIf
Ify>=Form1.ScaleHeight-Image1.HeightThen
y=Form1.ScaleHeight-Image1.Height
yp=(-1)*yp
EndIf
Ify<=OThen
y=O
yp=(-1)*yp
EndIf
IfImage7.Picture=Image5.PictureThen
'不斷改變圖象以實現翅膀的一張一合。
Image7.Picture=Image6.Picture
Else
Image7.Picture=Image5.Picture
EndIf
Image7.Movex,y'最關鍵的一步蝴蝶的移動
EndSub
模塊中的代碼:
DeclareFunctionShowCursorLib"user32"(ByValbSbowAsLong)AsLong
subendscrnsave()'結束此程序
showmouse
End
EndSub
Subshowmouse()
WhileShowCursor(True)<0
Wend
EndSub
SubHidemouse()'隱藏鼠標
WhileShowCursor(False)>=0
Wend
EndSub
subMain()
IfApp.PrevInstance=TrueThen
ExitSub
EndIf
Form1.Show
EndSub->