Delphi實戰一個文字屏保,文字的屏幕保護程序,運行後,屏幕中有一排文字不斷地在窗體中移動,同時字的顏色和窗體的背景色不停地改變。任何響應動作都可以結束該屏幕保護程序。主要是使用Timer 控件和Label 控件來實現屏保功能。運行界面效果如下所示:
制作Windows 的屏幕保護程序需要解決以下幾個問題:(1)編寫效果程序,利用Timer 控件使窗體的顏色和文字的顏色隨時間變化;(2)編寫OnCreate 事件,在該事件中,要初始化各控件的屬性變量、隱藏窗體的標題欄、隱藏任務欄等;(3)編寫各控件的OnMouseMove、OnMouseDown、OnKeyPress、OnClick 等事件處理程序,響應這些事件的都是關閉窗口;(4)將編譯好的.exe 程序放到Windows 下面的System 文件夾下,並將程序的擴展名改為.scr。
1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Unit1 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“給世界一個美麗的笑容”,BorderIcon 屬性為“[ ]”,biSystemMenu 屬性為“False”,biMinimize 屬性為“False”,biMaximize 屬性為“False”,BorderStyle 屬性為“bsNone”,Color 屬性為“clBlack”,FormStyle 屬性為“fsStayOnTop”,Name 屬性為“Form1”,Visible 屬性為“False”。
(2)選擇“標准”頁上的Panel 選項,在窗體中添加一個Panel 控件,在“屬性”面板中設置該控件的Align 屬性為alClIEnt。再選擇“標准”頁上的Label 選項,在窗體中添加一個Label 控件,設置其Caption 屬性為“給世界一個美麗的笑容”。
(3)選擇“系統”頁上的Timer 選項,在窗體中添加2 個Timer 控件,在“屬性”面板中設置其Name 屬性分別為Timer1 和Timer2,設置其Interval 屬性分別為20 和1000。
主要的代碼分析:
(1)程序運行時,需要隱藏任務欄、隱藏標題欄,同時需要初始化窗體及其中的控件,相關代碼如下:
procedure TForm1.FormCreate(Sender: TObject); var Save : LongInt; wndHandle : THandle; wndClass : array[0..50] of Char; begin //隱藏任務欄 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); wndHandle := FindWindow(@wndClass[0], nil); ShowWindow(wndHandle, SW_HIDE); //初始化窗體 Form1.Height:=screen.Height+150; Form1.Width:=screen.Width; Form1.Top:=0; Form1.Left:=0; //初始化窗體中的控件 panel1.Height:=screen.Height+150; panel1.Width:=screen.Width; panel1.Top:=0; panel1.Left:=0; //隱藏標題欄 If BorderStyle=bsNone then Exit; Save:=GetWindowLong(Handle,gwl_Style); If (Save and ws_Caption)=ws_Caption then begin Case BorderStyle of bsSingle, bsSizeable : SetWindowLong(Handle,gwl_Style,Save and (Not(ws_Caption)) or ws_border); bsDialog : SetWindowLong(Handle,gwl_Style,Save and (Not(ws_Caption)) or ds_modalframe or ws_dlgframe); End; Height:=Height-getSystemMetrics(sm_cyCaption); Refresh; end; brush.style:=bsClear; Inherited; end;
(2)兩個Timer 控件的OnTimer 事件控制文字的移動和顏色,以及面板顏色的變化,代碼如下:
procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Font.Color:=random(350000); //文字產生隨機顏色 if Label1.Left>screen.Width then //當文字移動到窗體之外時 Label1.Left:=-800 else Label1.Left:=Label1.Left+3; //文字向右移動 end; procedure TForm1.Timer2Timer(Sender: TObject); begin panel1.Color:=random(350000);//面板背景產生隨機顏色 end;
(3)程序運行時,如果鍵盤和鼠標有動作,程序立即停止運行,退出屏保,這需要分多種情況,分別對OnMouseMove、OnMouseDown、OnKeyPress、OnClick 等事件編寫代碼:
//鍵盤按下時,關閉窗體 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin Form1.close; end; //鼠標移動時,關閉窗體 procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); begin Form1.close; end; //點擊文字Label 時,關閉窗體 procedure TForm1.Label1Click(Sender: TObject); begin Form1.Close; end; //點擊面板Panel 時,關閉窗體 procedure TForm1.Panel1Click(Sender: TObject); begin Form1.Close; end; //鼠標在面板Panel 上點擊時,關閉窗體 procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Form1.Close; end;
(4)程序退出時,需要重新顯示任務欄:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var wndHandle : THandle; wndClass : array[0..50] of Char; begin //窗體關閉時顯示任務欄 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); wndHandle := FindWindow(@wndClass[0], nil); ShowWindow(wndHandle, SW_RESTORE); end;
Delphi文字屏保程序完整代碼:
vIEw source