如何利用C++ Builder 5.0 實現屏幕保護程序的開發
更新時間: 2007-05-22 17:55:47來源: 粵嵌教育瀏覽量:814
在Windows系統中為用戶提供了很多屏幕保護程序,如:“三維文字”、“三維變形物”,同時也有一些專門制作屏幕保護程序的應用軟件。要是自己能夠做一個有自己個性的屏幕保護程序,那該有多好。其實用戶完全可以開發一個有自己風格的屏幕保護程序,那該有多好,那么屏幕保護程序是怎樣工作的,又是怎樣實現的呢?。
原理:屏幕保護程序的文件名是SCR 文件,其實就是一個標準的.exe文件,他有二部份組成:保護程序執行
界面、保護程序設置界面。同時為了防止屏幕保護程序的重復執行和屏幕刷新帶來問題屏幕保護程序要處理Windows的幾個消息就可以了。為了使保護程序能夠按照用戶以前設置的參數運行,采用了注冊表技術來保存用戶的設置信息。
現以制作一個屏幕保護程序為例介紹如下:
1、在C++ Builder 5.0中建立一個含有兩個表單Form1和Form2 的工程文件Project1。其Form1用來設置運行參數,Form2用來執行屏幕保護程序.
在Form1中添加如下控件:
Name Caption
Label1 運行速度
Button1 確定
Button2 取消
Edit1
在Form2中添加如下控件
Name Property Value
Timer1 Interval 10
2 、在Unit1.h中添加如下代碼:
#include "registr.hpp"
private:
TRegistry MyReg;
TRegistry MyReg;
3 、在TForm1的OnShow事件中添加如下代碼:
void __fastcall TForm1::Form1Show(TObject *Sender)
{
MyReg=new TRegistry;
MyReg->RootKey=HKEY_LOCAL_MACHINE;
MyReg->OpenKey("Software\\MyCompany\\Remember",true);
Edit1->Text=MyReg->ReadInteger("Interval");//從注冊表中讀取屏幕保護程序的時間設置信息//
}
4 、在Form1的Button1的Click事件中添加如下代碼:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyReg->WriteInteger("Intervl",Edit1->Text.ToInt( ));
MyReg->Free( );//向注冊表中寫入屏幕保護程序的時間信息//
Close( );
}
5 、在Fom1的Button2的Click事件中添加如下代碼:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close( );
}
6、在Unit2.h中添加如下代碼:
Public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,WMEraseBkgnd)
MESSAGE_HANDLER(WM_ACTIVATE,TWMActivate,WMActivate)
MESSAGE_HANDLER(WM_SYSCOMMAND,TWMSysCommand,WMSysCommand)
END_MESSAGE_MAP(TForm)//定義要處理的Windows消息//
int x1,x2,x3 ,x4,x5,x6;
private:
void __fastcall CreateParams(TCreateParams &Params);
void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Msg);
void __fastcall WMActivate(TWMActivate &Msg);
void __fastcall WMSysCommand(TWMSysCommand &Msg);//用以響應和處理Windows消息。//
Graphics::TBitmap *ScreenBitmap;//屏幕保護程序的背景顏色//
7 、在Form2的OnCreate事件中添加如下代碼:
void __fastcall TForm2::Form2Create(TObject *Sender)
{
Left = 0;
Top = 0;
Width = Screen->Width;
Height= Screen->Height;// 使窗口的大小為整個屏幕的大小//
Cursor = crNone; file://隱藏屏幕光標//
ScreenBitmap->Width = Width;
ScreenBitmap->Height = Height;
SreenBitmap->Canvas->Brush->Color = clBlack;//設置屏幕背景大小和顏色//
ScreenBitmap->Canvas->FillRect(Rect(0,0,Width,Height));
Timer1->Enabled = true;
Form1->MyReg->OpenKey("Software\\MyCompany\\Remember",true);
Timer1->Interval=Form1->MyReg->ReadInteger("Interval");
x4=10;
x5=20;
x6=30;
}
8、在Form2的OnClose事件中添加如下代碼:
void __fastcall TForm2::Form2Close(TObject *Sender)
{
Timer1->Enabled = false;
delete ScreenBitmap;
}
9 、在Form2的OnKeyDown 、OnMouseDown、OnMouseMoves事件中添加如下代碼:
void __fastcall TForm2::Form2KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
Close( );
MyReg->Fee( );
}
void __fastcall TForm2::Form2MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Close( );
MyReg->Free( );
}
void __fastcall TForm2::Form2MouseMove(TObject *Sender, TShiftState Shift, int X,
int Y)
{
Close( );
MyReg->Free ( );
}//如果發生鼠標移動、鍵盤按鍵關閉屏幕保護程序//
10、處理Windows的WM_ERARSEBKGND消息:
void __fastcall TForm2::WMEraseBkgnd(TWMEraseBkgnd &Msg)
{
Msg.Result = false; file://不刷新屏幕背景//
}
11、處理Windows的WM_ACTIVE消息:
void __fastcall TForm2::WMActivate(TWMActivate &Msg)
{
if(Msg.Active == false)
Close(); file://當關閉關閉屏幕保護后,程序自動退出//
}
12 、處理Windows的WM_SYSCOMMAND消息:
void __fastcall TForm1::WMSysCommand(TWMSysCommand &Msg)
{
if(Msg.CmdType == SC_SCREENSAVE)
Msg.Result = true; file://防止屏幕保護程序被重復執行//
else
TForm::Dispatch(&Msg); file://程序把消息發往其他對象//
13、在Timer1的Timer事件中添加如下代碼:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
x1=Random(Screen.Height);
x2=Random(Screen.Weight);
x3=Random(Screen.Height);
Canvas->pen->Color=RGB(0,0,0);
Canvas->Pen->Width=10;
Canvas->Brush->Color=RGB(0,0,0);
Canvas->Ellipse(x4,x5,abs(x4-x6),abs(x5-x6));
Canvas->Pen->Color=RGB(Ranndom(255),Random(255),Random(255));
Canvas->Pen->Width=10;
Canvas->Brush->Color=RGB(Ranndom(255),Random(255),Random(255));
Canvas->Ellipse(x1,x2,abs(x1-x3),abs(x2-x3));
x4=x1;
x5=x2;
x6=x3;//屏幕保護效果,用戶可以自己定義//
}
14、 在Form2的OnPaint事件中添加如下代碼:
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Canvas->Draw(0,0,ScreenBitmap);//重畫背景//
}