<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
programSnow;
uses
Windows,Messages;
const
SnowNumber=500;//雪点数量-1
type
SnowNode=record
Point:TPoint;//雪点位置
Color:Integer;//先前颜色
Speed:Integer;//下落速率
nMove:Integer;//下落距离
Stick:Integer;//'粘连'度
end;
var
SnowNodes:array[0..SnowNumber]ofSnowNode;//雪点数组
hTimer:Integer;//'随机风向'时钟句柄
CrWind:Integer;//当前风向(-1~1)
CrStep:Integer;//当前循环步数(用于限速)
ScreenWidth,ScreenHeight:Integer;//屏幕尺寸
//取屏幕尺寸->ScreenWidth,ScreenHeight
procedureGetScreenSize;
begin
ScreenWidth:=GetSystemMetrics(SM_CXSCREEN);
ScreenHeight:=GetSystemMetrics(SM_CYSCREEN);
end;
//初始化雪点数组
procedureInitSnowNodes;
var
hScreenDc,J:Integer;
begin
hScreenDc:=CreateDC('DISPLAY',nil,nil,nil);
forJ:=0toSnowNumberdo
begin
SnowNodes[J].Point.X:=Random(ScreenWidth);
SnowNodes[J].Point.Y:=Random(ScreenHeight);
SnowNodes[J].Color:=GetPixel(hScreenDc,SnowNodes[J].Point.X,SnowNodes[J].Point.Y);
SnowNodes[J].Speed:=Random(5)+1;//几次循环作下落一次(1~5)
SnowNodes[J].nMove:=Random(SnowNodes[J].Speed)+1;//每次下落距离(1~5)
SnowNodes[J].Stick:=30-Random(SnowNodes[J].Speed);//'粘连'度
end;
DeleteDC(hScreenDc);
end;
//'随机风向'时钟
procedureTimerProc(hWnd:HWND;uMsg:UINT;idEvent:UINT;dwTime:DWORD);stdcall;
begin
SetTimer(0,hTimer,(Random(27)+4)*500,@TimerProc);//重设下次风向改变时间
if(CrWind0)thenCrWind:=0elseCrWind:=Random(3)-1;//修改风向
end;
//移动雪点
procedureMoveSnowNodes;
var
hScreenDc,I,X,Y:Integer;
begin
hScreenDc:=CreateDC('DISPLAY',nil,nil,nil);
forI:=0toSnowNumberdo
begin
//控制雪点下降速率
if(CrStepmodSnowNodes[I].Speed)0thenContinue;
//恢复上次被覆盖点
ifGetPixel(hScreenDc,SnowNodes[I].Point.X,SnowNodes[I].Point.Y)=$FFFFFFthen
SetPixel(hScreenDc,SnowNodes[I].Point.X,SnowNodes[I].Point.Y,SnowNodes[I].Color);
//根据风向作随机飘落
X:=SnowNodes[I].Point.X+Random(3)-1+CrWind;
Y:=SnowNodes[I].Point.Y+SnowNodes[I].nMove;
//积雪(停留)效果处理SnowNodes[J].Stick
if((CrStepmodSnowNodes[I].Stick)=0)//降低积雪概率..
and(GetPixel(hScreenDc,X,Y)GetPixel(hScreenDc,X,Y+1))//'边缘'判断
and(GetPixel(hScreenDc,X-1,Y)GetPixel(hScreenDc,X-1,Y+1))
and(GetPixel(hScreenDc,X+1,Y)GetPixel(hScreenDc,X+1,Y+1))then
begin
//稍微调整坐标
ifGetPixel(hScreenDc,X,Y-1)=GetPixel(hScreenDc,X,Y-2)thenDec(Y)//上边缘
elseifGetPixel(hScreenDc,X,Y+1)=GetPixel(hScreenDc,X,Y+2)thenInc(Y);//下边缘
Inc(X,CrWind);
//画三个点表示雪花
SetPixel(hScreenDc,X,Y,$FFFFFF);
SetPixel(hScreenDc,X+1,Y+1,$FFFFFF);
SetPixel(hScreenDc,X-1,Y+1,$FFFFFF);
//重生雪点
SnowNodes[I].Point.Y:=Random(10);
SnowNodes[I].Point.X:=Random(ScreenWidth);
SnowNodes[I].Color:=GetPixel(hScreenDc,SnowNodes[I].Point.X,SnowNodes[I].Point.Y);
endelse
begin
if(X0)or(X>ScreenWidth)or(Y>ScreenHeight)then//超出范围则重生雪点
begin
SnowNodes[I].Point.Y:=Random(10);
SnowNodes[I].Point.X:=Random(ScreenWidth);
SnowNodes[I].Color:=GetPixel(hScreenDc,SnowNodes[I].Point.X,SnowNodes[I].Point.Y);
endelse
begin
//保存颜色并绘制雪点
SnowNodes[I].Color:=GetPixel(hScreenDc,X,Y);
SetPixel(hScreenDc,X,Y,$FFFFFF);
//此时保存新雪点位置
SnowNodes[I].Point.X:=X;
SnowNodes[I].Point.Y:=Y;
end;
end;
end;
DeleteDC(hScreenDc);
CrStep:=CrStep+1;
end;
var
ThreadMsg:TMsg;//标准消息结构体
Frequency:Int64;//高性能定时器频率
StartCt,EndCt:Int64;//高性能定时器计数
ElapsedTime:Extended;//时间间隔
begin
GetScreenSize;//预置屏幕范围
InitSnowNodes;//初始化雪点数组
QueryPerformanceFrequency(Frequency);//高性能定时器频率
hTimer:=SetTimer(0,0,Random(5)*500,@TimerProc);//安装随机风向定时器
RegisterHotKey(0,0,MOD_CONTROL,ORD('L'));//注册退出热键Ctrl+L
whileTRUEdo//消息循环
begin
QueryPerformanceCounter(StartCt);//执行运算前计数值
ifPeekMessage(ThreadMsg,0,0,0,PM_REMOVE)then//取到消息
begin
caseThreadMsg.messageof
WM_TIMER:
TimerProc(0,0,0,0);//取到时钟消息说明时间已到
WM_HOTKEY:
begin
KillTimer(0,hTimer);//删除随机风向定时器
UnregisterHotKey(0,0);//删除退出热键Ctrl+L
InvalidateRect(0,nil,TRUE);//刷新屏幕
Break;//跳出消息循环
end;
WM_DISPLAYCHANGE:
begin
GetScreenSize;//重新取屏幕范围
InitSnowNodes;//初始化雪点数组
end;
end;
end;
MoveSnowNodes;//移动雪点
QueryPerformanceCounter(EndCt);//执行运算后计数值
ElapsedTime:=(EndCt-StartCt)/Frequency;
if(ElapsedTime0.0005)thenSleep(3)//限制循环速度
elseif(ElapsedTimeelseif(ElapsedTimeend;
end.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1929426
分享到:
相关推荐
JS 网页下雪 特效
下雪js特效源码,网页下雪源码,圣诞节下雪代码,下雪代码,下雪特效源码。 本源码由鼎盛互动开发。
圣诞节下雪特效
4、jquery.snow网页下雪特效
windows桌面下雪特效的exe程序,娱乐放松的小软件! windows桌面下雪特效的exe程序,娱乐放松的小软件! windows桌面下雪特效的exe程序,娱乐放松的小软件! windows桌面下雪特效的exe程序,娱乐放松的小软件! ...
用JS实现下雪的特效,带背景音乐,雪花形状花瓣不断变化
基于C#语言和VS .Net_Framwork环境开发的Windows桌面下雪特效
一个C#编写的在桌面下雪的程序。我添加了鼠标穿透功能,从而雪花不会影响其他任何程序的应用。
用VB实现下雪特效的例子,用于界面的动感美化
ipad,iphone开发。源代码。案例
用Flash动作脚本实现下雪特效的制作 很简单的,效果很好。
ArcGIS JS API+Three.js实现下雪特效的代码。查看效果https://blog.csdn.net/qq_37155408/article/details/115864931
圣诞节下雪特效源码;原生JS实现;可无缝对接到自己的web开发中;使用与圣诞节活动开发,表白告白使用;web前端必备技能代码; 文件解压密码:jiangzao
flash 动画 下雨特效 下雪特效 附带有fla格式的 还有swf格式。。
FLASH制作的下雪特效 源文件 FLASH制作的下雪特效 源文件
让你的网页出现下雪的氛围,圣诞节专用特效素材,jquery实现网页下雪特效,懒人之家推荐下载
基于jQuery制作的一款很漂亮的下雪特效
canvas下雪特效源码,对应我的canvas下雪的那篇文章
WebSnowjq.js是一款基于HTML5 canvas的超简单和逼真的下雪场景特效js插件。该下雪特效插件可以通过简单的参数设置了设定雪花的数量。每朵雪花的飘落速度各不相同,层次感非常强
下雪_基于C#的桌面下雪特效案例_源码.zip