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

Delphi制作文字屏保程序

編輯:Delphi

Delphi實戰一個文字屏保,文字的屏幕保護程序,運行後,屏幕中有一排文字不斷地在窗體中移動,同時字的顏色和窗體的背景色不停地改變。任何響應動作都可以結束該屏幕保護程序。主要是使用Timer 控件和Label 控件來實現屏保功能。運行界面效果如下所示:

Delphi制作文字屏保

制作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 print? 001 unit Unit1; 002 interface 003 uses 004 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 005 ExtCtrls, StdCtrls; 006 type 007 TForm1 = class(TForm) 008 Timer1: TTimer; 009 Panel1: TPanel; 010 Label1: TLabel; 011 Timer2: TTimer; 012 procedure FormCreate(Sender: TObject); 013 procedure FormKeyPress(Sender: TObject; var Key: Char); 014 procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); 015 procedure Timer1Timer(Sender: TObject); 016 procedure Timer2Timer(Sender: TObject); 017 procedure Panel1Click(Sender: TObject); 018 procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;Shift: 019 TShiftState; X,Y:Integer); 020 procedure FormClose(Sender: TObject; var Action: TCloseAction); 021 procedure Label1Click(Sender: TObject); 022 private 023 { Private declarations } 024 public 025 { Public declarations } 026 end; 027 var 028 Form1: TForm1; 029 implementation 030 {$R *.DFM} 031 procedure TForm1.FormCreate(Sender: TObject); 032 var 033 Save : LongInt; 034 wndHandle : THandle; 035 wndClass : array[0..50of Char; 036 begin 037 //隱藏任務欄 038 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); 039 wndHandle := FindWindow(@wndClass[0], nil); 040 ShowWindow(wndHandle, SW_HIDE); 041 //初始化窗體 042 Form1.Height:=screen.Height+150; 043 Form1.Width:=screen.Width; 044 Form1.Top:=0; 045 Form1.Left:=0; 046 //初始化窗體中的控件 047 panel1.Height:=screen.Height+150; 048 panel1.Width:=screen.Width; 049 panel1.Top:=0; 050 panel1.Left:=0; 051 //隱藏標題欄 052 If BorderStyle=bsNone then Exit; 053 Save:=GetWindowLong(Handle,gwl_Style); 054 If (Save and ws_Caption)=ws_Caption then 055 begin 056 Case BorderStyle of 057 bsSingle, 058 bsSizeable : SetWindowLong(Handle,gwl_Style,Save and (Not(ws_Caption)) 059 or ws_border); 060 bsDialog : SetWindowLong(Handle,gwl_Style,Save and (Not(ws_Caption)) or 061 ds_modalframe or ws_dlgframe); 062 End; 063 Height:=Height-getSystemMetrics(sm_cyCaption); 064 Refresh; 065 end; 066 brush.style:=bsClear; 067 Inherited; 068 end; 069 //鍵盤按下時,關閉窗體 070 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 071 begin 072 Form1.close; 073 end; 074 //鼠標移動時,關閉窗體 075 procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: 076 Integer); 077 begin 078 Form1.close; 079 end; 080 //點擊文字Label 時,關閉窗體 081 procedure TForm1.Label1Click(Sender: TObject); 082 begin 083 Form1.Close; 084 end; 085 //點擊面板Panel 時,關閉窗體 086 procedure TForm1.Panel1Click(Sender: TObject); 087 begin 088 Form1.Close; 089 end; 090 //鼠標在面板Panel 上點擊時,關閉窗體 091 procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; 092 Shift: TShiftState; X, Y: Integer); 093 begin 094 Form1.Close; 095 end; 096 procedure TForm1.Timer1Timer(Sender: TObject); 097 begin 098 Label1.Font.Color:=random(350000); //文字產生隨機顏色 099 if Label1.Left>screen.Width then //當文字移動到窗體之外時 100 Label1.Left:=-800 101 else 102 Label1.Left:=Label1.Left+3//文字向右移動 103 end; 104 procedure TForm1.Timer2Timer(Sender: TObject); 105 begin 106 panel1.Color:=random(350000);//面板背景產生隨機顏色 107 end; 108 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 109 var 110 wndHandle : THandle; 111 wndClass : array[0..50of Char; 112 begin 113 //窗體關閉時顯示任務欄 114 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); 115 wndHandle := FindWindow(@wndClass[0], nil); 116 ShowWindow(wndHandle, SW_RESTORE); 117 end; 118 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved