程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi制作實現圖像屏保程序

Delphi制作實現圖像屏保程序

編輯:Delphi

本文介紹如何用Delphi編寫一個圖像屏保程序,也就是用有圖片的屏幕保護程序,在編寫方面主要是使用Timer 控件和Image 控件。本屏保在編寫時需要解決的關鍵問題是使屏幕保護程序覆蓋整個屏幕和使得窗體中的圖片垂直交錯變化。前者利用WindowsState:=wsMaximized;覆蓋屏幕,利用ShowCursor(False);隱藏光標。後者可以這樣來實現:將要顯示的圖形拆成兩部分,奇數條掃描線由上往下搬移,偶數條掃描線的部分則由下往上搬移,而且兩者同時進行。從屏幕上便可看到分別由上下兩端出現的較淡圖形向屏幕中央移動,直到完全清楚為止。Delphi圖像屏保程序界面效果如下:

圖片屏保 圖片交替變化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 print? 01 unit Unit1; 02 interface 03 uses 04 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 05 Dialogs, ExtCtrls; 06 type 07 TSav_Form = class(TForm) 08 Timer1: TTimer; 09 Image1: TImage; 10 procedure Timer1Timer(Sender: TObject); 11 procedure ForMactivate(Sender: TObject); 12 procedure FormShow(Sender: TObject); 13 procedure Image1DblClick(Sender: TObject); 14 procedure FormDblClick(Sender: TObject); 15 private 16 { Private declarations } 17 procedure ShowPic(); 18 public 19 { Public declarations } 20 end; 21 var 22 Sav_Form: TSav_Form; 23 implementation 24 {$R *.dfm} 25 procedure TSav_Form.ShowPic(); 26 var 27 newbmp:Tbitmap; 28 i,j,bmpHeight,bmpWidth:integer; 29 begin 30 newbmp:= Tbitmap.Create; //定義新圖片 31 newbmp.Width:=Image1.Width; 32 newbmp.Height:=Image1.Height; 33 bmpHeight:=Image1.Height; 34 bmpWidth:=Image1.Width; 35 i:=0; 36 while i<=bmpHeight do 37 begin 38 j:=i; 39 while(j >0)do 40 begin 41 newbmp.Canvas.CopyRect(Rect(0,j-1,bmpWidth,j),Image1.Canvas,Rect(0,bmpHeight-i+j-1, 42 bmpWidth,bmpHeight-i+j)); 43 newbmp.Canvas.CopyRect(Rect(0,bmpHeight-j,bmpWidth,bmpHeight-j+1),Image1.Canvas, 44 Rect(0,i-j,bmpWidth,i-j+1)); 45 j:=j-2; 46 end; 47 Sav_Form.Canvas.Draw(20,10,newbmp); //畫布上顯示圖像 48 i:=i+2; 49 end; 50 newbmp.free; //釋放定義的圖片 51 end; 52 procedure TSav_Form.Timer1Timer(Sender: TObject); 53 begin 54 ShowPic; //顯示圖片 55 end; 56 procedure TSav_Form.ForMactivate(Sender: TObject); 57 begin 58 Windowstate:=wsMaximized; //覆蓋屏幕 59 ShowCursor(False); //隱藏光標 60 end; 61 procedure TSav_Form.FormShow(Sender: TObject); 62 begin 63 ShowCursor(False); //隱藏鼠標 64 end; 65 procedure TSav_Form.Image1DblClick(Sender: TObject); 66 begin 67 showmessage(’退出屏幕保護程序?’); 68 close; 69 end; 70 procedure TSav_Form.FormDblClick(Sender: TObject); 71 begin 72 showmessage(’退出屏幕保護程序?’); 73 close; 74 end; 75 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved