本文介紹如何用Delphi編寫一個圖像屏保程序,也就是用有圖片的屏幕保護程序,在編寫方面主要是使用Timer 控件和Image 控件。本屏保在編寫時需要解決的關鍵問題是使屏幕保護程序覆蓋整個屏幕和使得窗體中的圖片垂直交錯變化。前者利用WindowsState:=wsMaximized;覆蓋屏幕,利用ShowCursor(False);隱藏光標。後者可以這樣來實現:將要顯示的圖形拆成兩部分,奇數條掃描線由上往下搬移,偶數條掃描線的部分則由下往上搬移,而且兩者同時進行。從屏幕上便可看到分別由上下兩端出現的較淡圖形向屏幕中央移動,直到完全清楚為止。Delphi圖像屏保程序界面效果如下:
具體編寫步驟:
1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Sav”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Unit1 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“屏幕保護程序”,BorderIcon 屬性為“[ ]”,biSystemMenu 屬性為“False”,biMinimize 屬性為“False”,biMaximize 屬性為“False”,BorderStyle 屬性為“bsNone”,Color 屬性為“clBlack”,FormStyle 屬性為“fsStayOnTop”,Name 屬性為“Sav_Form”,Visible 屬性為“False”。
(2)選擇“附加”頁上的Image 選項,在窗體中添加Image 控件。在“屬性”面板中設置該控件的Name 屬性為“Image1”,Align 屬性為“alClIEnt”,使其占據整個窗體,用鼠標點擊Picture 屬性右邊的文本框,從彈出的對話框中選擇合適的圖像文件。
(3)選擇“系統”頁上的Timer 選項,在窗體中添加一個Timer 控件,在“屬性”面板中設置其Enabled 屬性為“True”,Interval 屬性為“2000”,Name 屬性為“Timer1”,Tag 屬性為“0”。
關鍵代碼分析:
(1)為了實現屏幕保護程序中的圖像顯示特效,需要定義一個函數,來實現圖像的垂直交錯顯示效果,Timer 控件的OnTimer 事件只需直接調用該函數即可:
procedure TSav_Form.ShowPic(); var newbmp:Tbitmap; i,j,bmpHeight,bmpWidth:integer; begin newbmp:= Tbitmap.Create; //定義新圖片 newbmp.Width:=Image1.Width; newbmp.Height:=Image1.Height; bmpHeight:=Image1.Height; bmpWidth:=Image1.Width; i:=0; while i<=bmpHeight do begin j:=i; while(j >0)do begin newbmp.Canvas.CopyRect(Rect(0,j-1,bmpWidth,j),Image1.Canvas,Rect(0,bmpHeight-i+j-1, bmpWidth,bmpHeight-i+j)); newbmp.Canvas.CopyRect(Rect(0,bmpHeight-j,bmpWidth,bmpHeight-j+1),Image1.Canvas, Rect(0,i-j,bmpWidth,i-j+1)); j:=j-2; end; Sav_Form.Canvas.Draw(20,10,newbmp); //畫布上顯示圖像 i:=i+2; end; newbmp.free; //釋放定義的圖片 end; procedure TSav_Form.Timer1Timer(Sender: TObject); begin ShowPic; //顯示圖片 end;
(2)程序運行時,需要隱藏鼠標,並且使得窗體覆蓋整個屏幕:
procedure TSav_Form.ForMactivate(Sender: TObject); begin Windowstate:=wsMaximized; //覆蓋屏幕 ShowCursor(False); //隱藏光標 end; procedure TSav_Form.FormShow(Sender: TObject); begin ShowCursor(False); //隱藏鼠標 end;
(3)當在窗體或圖片上雙擊鼠標左鍵時,給出是否確認退出程序的提示,如果是,關閉窗體,退出屏保程序:
procedure TSav_Form.Image1DblClick(Sender: TObject); begin showmessage(’退出屏幕保護程序?’); close; end; procedure TSav_Form.FormDblClick(Sender: TObject); begin showmessage(’退出屏幕保護程序?’); close; end;
完整代碼如下:
vIEw source