<html>
<head>
<title>用DELPHI设计屏幕保护程序</title>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
</tr>
</tbody>
</table>
<table border=0 bordercolordark=#66aaff bordercolorlight=#66aaff cellpadding=0
cellspacing=0 width=680 align="center" height="128">
<tbody>
<tr>
<td bgcolor=#F9D23C height=14>
<div align=center class=H1> <b><font
color=#ffa000><b><font color="#FFFFFF">用DELPHI设计屏幕保护程序 </font></b></font></b></font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=236>
<p align="center"><br>
<br>
景德镇市第五中学 严剑 </p>
<p>----屏幕保护程序是一类特殊的WINDOWS程序。如果已安装了屏幕保护程序,超过等待时间没有鼠标和键盘操作,WINDOWS会自动运行屏幕保护程序以保护屏幕。在休息之余,欣赏一下漂亮的WINDOWS屏幕保护,使人赏心悦目。那么设计屏幕保护程序要注意哪些方面?由于屏幕保护程序需满足一些特殊条件,比如屏幕保护程序只能有一个实例运行,运行后一旦使用鼠标或键盘应立即结束程序,能接受参数等。设计屏幕保护程序要充分考虑到这些,本文探讨用DELPHI制作一个屏幕保护程序(以下简称SCR),最后给出一个可运行的实例。<br>
<br>
----一、TCanvas与TBitMap对象、JPEG对象:<br>
<br>
----DELPHI的TCanvas封装了大部分WINDOWS对图形的操作,SCR运行时各种图像千变万化、图形变幻无不是TCanvas的“杰作”。TBitMap对象有一个LoadFromFile()方法,能从BMP图像文件取得位图。一般情况下,设计SCR要创建至少一个TBitMap对象,由于窗体和TBitMap对象都有Canvas属性,可利用TCanvas中的各种函数设计图像。设计一个有各种图像变化效果的SCR常用到以下函数:<br>
<br>
----1、CopyRect方法:从其原型CopyRect(Dest:TRect;Canvas:TCanvas;Source:TRect)可看出,它将源画布某一矩形区域的图像复制到另一个画布的矩形区域。由于是内存的成块复制,因此具有很高的执行效率。在Timer组件的OnTimer事件程序中灵活使用该函数,可以设计出各种美观演示效果:如百叶窗、推拉、马赛克、随机线、反像等等。将以下代码加入到OnTimer事件程序,可演示各种图像效果,这里仅举出两种效果,读者可参考有关资料设计更多更漂亮的演示效果。<br>
......<br>
case PlayMode of<br>
0:begin //从左向右移动(设x初值为Screen.Width) <br>
x:=x-10;<br>
SCRSaverFrom.CopyRect(Rect<br>
(x,0,x+10,Screen.Height),Bit.Canvas, <br>
Rect(x,0,x+10,Screen.Height));<br>
if x=0 then ChangePictureAndPlayMode;//改变图像及演示模式<br>
end;<br>
1:begin //马赛克<br>
for i:=0 to Screen.Width*Screen.Height div 10 do<br>
begin<br>
j := Random(Screen.Width div 4)*4; <br>
k := Random(Screen.Height div 4)*4;<br>
SCRSaverFrom.CopyRect(Rect(j,k,j+4,k+4),Bit.Canvas,<br>
Rect(j,k,j+4,k+4));<br>
end;<br>
SCRSaverFrom.CopyRect(Rect<br>
(0,0,Screen.Width,Screen.Height),Bit.Canvas,<br>
Rect(0,0,Screen.Width,Screen.Height));<br>
ChangePictureAndPlayMode; //改变图像及演示模式<br>
end;<br>
2: ......<br>
......<br>
end;<br>
----2、StretchDraw方法:一般说来,使用CopyRect方法要求源矩形与目的矩形<br>
应相等,如果两者尺寸相差太大时,色彩可能失真。使用StretchDraw能避免这个<br>
问题,其原型为:StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画<br>
布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸<br>
不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能“画”<br>
出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用<br>
StretchDraw()使整幅位图变形”输出到一个画布,然后再用CopyRect()函数将所<br>
需部分“画出”。<br>
<br>
----3、TextOut方法:在指定的位置输出一串文字。在Canvas中还有很多函数可<br>
绘制图形,也能用于SCR的设计,这里就不加介绍。<br>
<br>
----4、支持JPEG图像。由于JPEG图像格式具有很好的压缩性能,是最常用的图像<br>
格式之一。DELPHI3/4中新加入了对JPEG图像的支持,JpegImage是TGraphic的派<br>
生类,它的LoadFromFile方法可从JPEG文件取出一幅图像,JpegImage没有Canvas<br>
属性,不能用CopyRect()方法,但其它画布可用StretchDraw()方法显示出一个<br>
JPEG图像,就将JPEG图像转换成位图。请看下面例子,其中Bit为全局的TBitMap<br>
对象。注意:使用JpegImage应在USES中加入JPEG单元。<br>
<br>
procedure LoadBMPFromJPEG(JPEGFileName:String);<br>
// 从JPEG 文 件 中 取 图 像<br>
var JpegImage1:TJpegImage;<br>
begin<br>
JpegImage1 := TJpegImage.Create;<br>
JpegImage1.LoadFromFile(JPEGFileName);<br>
Bit.Width := JpegImage1.Width ; <br>
// 使 位 图 与JPEG 图 像 尺 寸 相 等<br>
Bit.Height := JpegImage1.Height ;<br>
Bit.Canvas.StretchDraw(Rect<br>
(0,0,Bit.Width,Bit.Height),JpegImage1);<br>
JpegImage1.Free ;<br>
end;<br>
<br>
----二、MediaPlayer和Timer组件:<br>
<br>
----MediaPlayer组件封装了MCI中绝大部分的功能,利用它很容易播放WAVE和<br>
MIDI音乐,为SCR添加美妙的背景音乐。有关代码如下:<br>
<br>
ifMediaPlayer1.Mode<>mpPLayingthen<br>
//音乐播放完后,更换音乐<br>
begin<br>
inc(i);<br>
MediaPlayer1.FileName:=IntToStr(i)+`.WAV`;<br>
//逐一播放1.wav,2.wav...<br>
MediaPlayer1.Open;<br>
MediaPlayer1.Play;<br>
end;<br>
<br>
----Timer组件是一个定时器,它的Interval属性指定定时器的间隔时间,每隔<br>
指定的时间就会执行一次OnTimer事件,SCR的OnTimer事件内要完成演示图像,<br>
更换图像,检查音乐是否播放完毕,更换音乐等各项工作。因此,Timer是设计<br>
SCR程序必不可少的组件。<br>
<br>
----三、设置SCR的窗体:<br>
<br>
----SCR的窗体与一般程序的窗体没有太大的区别。设计时只需注意到以下几点:<br>
<br>
----1、设置窗体属性:WindwoState属性一般设为wsMaximized,使窗体覆盖整<br>
个屏幕;BorderStyle属性设为bsNone,使窗体无边框、标题;FormStyle属性设<br>
为fsStayOnTop,使窗体总是保持在屏幕最上面。<br>
<br>
----2、防止SCR重复运行:为防止程序重复运行,在WINS95/98可用API函数<br>
FindWindow查找已运行的窗体类型,API函数原型:<br>
HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)。以下演示SCR是<br>
如何避免重复运行的。打开Project,在USES单元中加入WinTypes和SysUtils单元。<br>
program Project1;<br>
uses<br>
Forms, WinTypes, SysUtils, //后两者为新加入单元<br>
Unit1 in `Unit1.pas` {MyScreenSaverForm};<br>
{$R *.RES}<br>
var FindWindwsHandle:array[0..255] of Char; //存放窗体名<br>
para1:String;<br>
......<br>
StrPCopy(FindWindwsHandle,`TMyScreenSaverForm`);<br>
//TMyScreenSaverForm是这个SCR的窗体名。<br>
if FindWindow(FindWindwsHandle,Nil) = 0 //寻找同一窗口类型<br>
then ...... //没有同一窗体重复运行<br>
else ...... //发现有同一窗体重复运行<br>
......<br>
<br>
----注意:由于Dephi在设计窗体时已向Windows登记了TMyScreenSaverForm窗<br>
体,若在Dephi调试器内运行该程序,FindWindow函数会发现已有一个窗体,<br>
它会执行else后面的代码,调试时应注意这一点。如要使该程序顺利运行,须<br>
先执行File菜单中的Close命令,将TMyScreenSaverForm窗体关闭掉。<br>
<br>
----3、SCR的鼠标:<br>
<br>
显示/隐藏鼠标:S