procedure GetScreenSize; begin ScreenWidth := GetSystemMetrics(SM_CXSCREEN); ScreenHeight := GetSystemMetrics(SM_CYSCREEN); end;
procedure PrintInfo; var i,hdc:integer; hi,wi:integer; begin
hi:=ScreenHeight div 2; wi:=screenWidth div 2; hdc := CreateDC('DISPLAY', nil, nil, nil); SetBkMode(hdc, TRANSPARENT); for I := wi-200 to wi+200 do begin setPixel(hdc,i,hi-100,$FF0000); setPixel(hdc,i,hi+100,$FF0000); end; for i:=hi-100 to hi+100 do begin setPixel(hdc,wi-200,i,$FF0000); setPixel(hdc,wi+200,i,$FF0000); end; if(hc mod 4=0) then begin textout(hdc,wi-200+20,hi-100+30, '祝我的朋友圣诞快乐,在新的一年赚钱多多',38); textout(hdc,wi-200+20,hi-100+60,'永远不要忘了我这个远方的老朋友,好盼望下雪的味道',48); textout(hdc,wi-200+20,hi-100+90,'你远方的朋友:薛林浩,网名:空山雪林',36); textout(hdc,wi-200+40,hi-100+130,'请戴上你的耳机,欣赏这首天澜之音!!!',38); textout(hdc,wi-200+20,hi-100+180,'【按CTRL+N看下一条信息,按CTRL+Q退出,DELPHI开发】',50); end else if(hc mod 4=1) then begin textout(hdc,wi-200+20,hi-100+30, '有句话一直想对你说,可你知道它的分量,一旦说出,',46); textout(hdc,wi-200+20,hi-100+60,'可能咱连朋友都没法做了,但我控制不住感情,混出头那天',52); textout(hdc,wi-200+20,hi-100+90,'一定请我吃饭。这顿饭我一定能等到。老哥,圣诞快乐!',50); textout(hdc,wi-200+20,hi-100+180,'【按CTRL+N看下一条信息,按CTRL+Q退出,DELPHI开发】',50); end else if(hc mod 4=2) then begin textout(hdc,wi-200+20,hi-100+30, '做坏事叫坏蛋,脑袋空空叫傻蛋,炒鱿鱼叫滚蛋,',44); textout(hdc,wi-200+20,hi-100+60,'骂人叫混蛋,呜呼哀哉叫完蛋,',28); textout(hdc,wi-200+20,hi-100+90,'啃不到骨头的去吃乌鸡白凤蛋,正在看短信的快乐圣诞!',50); textout(hdc,wi-200+20,hi-100+180,'【按CTRL+N看下一条信息,按CTRL+Q退出,DELPHI开发】',50); end else begin textout(hdc,wi-200+20,hi-100+30, '女人二十是半成品,三十是成品,',30); textout(hdc,wi-200+20,hi-100+60, '四十是精品,五十是极品,',24); textout(hdc,wi-200+20,hi-100+90, '六十是上品,七十是废品,八十是纪念品。',38); textout(hdc,wi-200+20,hi-100+120, '你永远是我心中的精品。老搭档,圣诞快乐!',40); textout(hdc,wi-200+20,hi-100+180,'【按CTRL+N看下一条信息,按CTRL+Q退出,DELPHI开发】',50); end; DeleteDC(hdc); end;
procedure TimerProc1(hwnd:HWND;uMsg:UINT;idEvent:UINT;dwtime:Dword);stdcall; begin SetTimer(0, hTimer1, 10, @TimerProc1); end;
procedure moveText; var i:integer; curwii:integer; hdc:integer; begin hdc := CreateDC('DISPLAY', nil, nil, nil); SetBkMode(hdc, TRANSPARENT); curhi:=screenHeight div 2; curwii:=screenWidth div 2; setPixel(hdc,curwi,curhi-100,$FF0000); setPixel(hdc,curwii-200+curwi,curhi+100,$FF0000); curwi:=curwi+1; DeleteDC(hdc); end; // 初始化雪点数组
procedure InitSnowNodes; var j,k,hScreenDc:integer; begin hScreenDc := CreateDC('DISPLAY', nil, nil, nil); for J := 0 to SnowNumber do begin SnowNodes[J].Point.X := Random(ScreenWidth); SnowNodes[J].Point.Y := Random(ScreenHeight); for k := 0 to num do SnowNodes[J].Color[k] := GetPixel(hScreenDc, SnowNodes[J].Point.X + SnowShapeX[k], SnowNodes[J].Point.Y + SnowShapeY[k]); SnowNodes[J].Speed := Random(5) + 1; // 几次循环作下落一次 (1~5) SnowNodes[J].nMove := Random(SnowNodes[J].Speed) + 3; // 每次下落距离(1~5) SnowNodes[J].Stick := 30 - Random(SnowNodes[J].Speed); // '粘连'度(几次循环作一次粘连判断) end; DeleteDC(hScreenDc); end;
// 移动雪点 ..
procedure MoveSnowNodes; var hScreenDc, I, X, Y, k: Integer; begin hScreenDc := CreateDC('DISPLAY', nil, nil, nil); for I := 0 to SnowNumber do begin // 控制雪点下降速率 if (CrStep mod SnowNodes[I].Speed) <> 0 then Continue; // 恢复上次被覆盖点 for k := 0 to num do if GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]) = SnowColor then SetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k], SnowNodes[I].Color[k]); // 根据风向作随机飘落 X := SnowNodes[I].Point.X + Random(3) - 1 + CrWind; Y := SnowNodes[I].Point.Y + SnowNodes[I].nMove; // 积雪(停留)效果处理 if ((CrStep mod SnowNodes[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 // 稍微调整坐标 if GetPixel(hScreenDc, X, Y - 1) = GetPixel(hScreenDc, X, Y - 2) then Dec(Y) // 上边缘 else if GetPixel(hScreenDc, X, Y + 1) = GetPixel(hScreenDc, X, Y + 2) then Inc(Y); // 下边缘 Inc(X, CrWind); // 画三个点(雪花) for k := 0 to num do SetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k], SnowColor); // 重生雪点 SnowNodes[I].Point.Y := Random(10); SnowNodes[I].Point.X := Random(ScreenWidth); for k := 0 to num do SnowNodes[I].Color[k] := GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]); end else begin if (X < 0) or (X > ScreenWidth) or (Y > ScreenHeight) then // 超出范围则重生雪点 begin SnowNodes[I].Point.Y := Random(10); SnowNodes[I].Point.X := Random(ScreenWidth); for k := 0 to num do SnowNodes[I].Color[k] := GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]); end else begin // 保存颜色并绘制雪点 for k := 0 to num do begin SnowNodes[I].Color[k] := GetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k]); SetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k], SnowColor); end; // 此时保存新雪点位置 SnowNodes[I].Point.X := X; SnowNodes[I].Point.Y := Y; end; end; end; DeleteDC(hScreenDc); Inc(CrStep); end;
ARStream := TResourceStream.Create(HInstance, 'MDI_0', 'MDI'); // 找资源 TempFile := 'xajh.MID'; ARStream.SaveToFile(TempFile); MCISendString(pchar('OPEN '+tempfile+' TYPE SEQUENCER ALIAS NN'), ', 0, 0); MCISendString('PLAY NN FROM 0', ', 0, 0); MCISendString('CLOSE ANIMATION', ', 0, 0);
while TRUE do // 消息循环 begin PrintInfo; if(curwi>=((screenWidth div 2)+200)) then begin KillTimer(0, hTimer1); end; Sleep(20); QueryPerformanceCounter(StartCt); // 执行运算前 计数值 if PeekMessage(ThreadMsg, 0, 0, 0, PM_REMOVE) then // 取到消息 begin case ThreadMsg.message of WM_TIMER: begin TimerProc(0, 0, 0, 0); // 预设风向改变时间已到 timerProc1(0,0,0,0); end; WM_HOTKEY: begin KillTimer(0, hTimer); // 删除随机风向定时器 if(ThreadMsg.wParam=1) then begin InvalidateRect(0, nil, TRUE); // 刷新屏幕 hc:=(hc+1) mod 4; end else begin InvalidateRect(0, nil, TRUE); // 刷新屏幕 Break; // 跳出消息循环 end; end;
WM_DISPLAYCHANGE: begin GetScreenSize; // 重新取屏幕尺寸 InitSnowNodes; // 初始化雪点数组 PrintInfo; end; end; end; MoveSnowNodes; // 移动雪点 // moveText; QueryPerformanceCounter(EndCt); // 执行运算后计数值 ElapsedTime := (EndCt - StartCt) / Frequency; if (ElapsedTime < 0.0005) then Sleep(2) // 简单限速 else if (ElapsedTime < 0.0010) then Sleep(1) else if (ElapsedTime < 0.0015) then Sleep(0); end; DeleteFile(TempFile); // 删除临时文件 ARStream.Free; end.
procedure InitSnowNodes; var hScreenDc, J, k: Integer; begin hScreenDc := CreateDC('DISPLAY', nil, nil, nil); for J := 0 to SnowNumber do begin SnowNodes[J].Point.X := Random(ScreenWidth); SnowNodes[J].Point.Y := Random(ScreenHeight); for k := 0 to num do SnowNodes[J].Color[k] := GetPixel(hScreenDc, SnowNodes[J].Point.X + SnowShapeX[k], SnowNodes[J].Point.Y + SnowShapeY[k]); 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;
// 移动雪点 ..
procedure MoveSnowNodes; var hScreenDc, I, X, Y, k: Integer; begin hScreenDc := CreateDC('DISPLAY', nil, nil, nil); for I := 0 to SnowNumber do begin // 控制雪点下降速率 if (CrStep mod SnowNodes[I].Speed) <> 0 then Continue; // 恢复上次被覆盖点 for k := 0 to num do if GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]) = SnowColor then SetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k], SnowNodes[I].Color[k]); // 根据风向作随机飘落 X := SnowNodes[I].Point.X + Random(3) - 1 + CrWind; Y := SnowNodes[I].Point.Y + SnowNodes[I].nMove; // 积雪(停留)效果处理 if ((CrStep mod SnowNodes[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 // 稍微调整坐标 if GetPixel(hScreenDc, X, Y - 1) = GetPixel(hScreenDc, X, Y - 2) then Dec(Y) // 上边缘 else if GetPixel(hScreenDc, X, Y + 1) = GetPixel(hScreenDc, X, Y + 2) then Inc(Y); // 下边缘 Inc(X, CrWind); // 画三个点(雪花) for k := 0 to num do SetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k], SnowColor); // 重生雪点 SnowNodes[I].Point.Y := Random(10); SnowNodes[I].Point.X := Random(ScreenWidth); for k := 0 to num do SnowNodes[I].Color[k] := GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]); end else begin if (X < 0) or (X > ScreenWidth) or (Y > ScreenHeight) then // 超出范围则重生雪点 begin SnowNodes[I].Point.Y := Random(10); SnowNodes[I].Point.X := Random(ScreenWidth); for k := 0 to num do SnowNodes[I].Color[k] := GetPixel(hScreenDc, SnowNodes[I].Point.X + SnowShapeX[k], SnowNodes[I].Point.Y + SnowShapeY[k]); end else begin // 保存颜色并绘制雪点 for k := 0 to num do begin SnowNodes[I].Color[k] := GetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k]); SetPixel(hScreenDc, X + SnowShapeX[k], Y + SnowShapeY[k], SnowColor); end; // 此时保存新雪点位置 SnowNodes[I].Point.X := X; SnowNodes[I].Point.Y := Y; end; end; end; DeleteDC(hScreenDc); Inc(CrStep); end;
var ThreadMsg: TMsg; // 标准消息结构体 Frequency: Int64; // 高性能定时器频率 StartCt, EndCt: Int64; // 高性能定时器计数 ElapsedTime: Extended; // 时间间隔 begin Randomize; GetScreenSize; InitSnowNodes; // 初始化 QueryPerformanceFrequency(Frequency); // 高性能定时器频率 hTimer := SetTimer(0, 0, Random(5) * 500, @TimerProc); // 安装随机风向定时器 RegisterHotKey(0, 0, MOD_CONTROL, ORD('L')); // 注册退出热键 Ctrl+L while TRUE do // 消息循环 begin QueryPerformanceCounter(StartCt); // 执行运算前 计数值 if PeekMessage(ThreadMsg, 0, 0, 0, PM_REMOVE) then // 取到消息 begin case ThreadMsg.message of WM_TIMER: TimerProc(0, 0, 0, 0); // 预设风向改变时间已到