{"id":482,"date":"2009-06-23T19:06:00","date_gmt":"2009-06-23T11:06:00","guid":{"rendered":""},"modified":"2013-11-17T17:25:40","modified_gmt":"2013-11-17T09:25:40","slug":"delphi%e4%b8%8b%e9%9b%aa%e7%a8%8b%e5%ba%8f","status":"publish","type":"post","link":"https:\/\/kyle.ai\/blog\/482.html","title":{"rendered":"Delphi\u4e0b\u96ea\u7a0b\u5e8f"},"content":{"rendered":"<pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\r\nprogram Snow;\r\nuses\r\n  Windows,\r\n  Messages;\r\n\r\nconst\r\n  SnowNumber = 500; \/\/ \u96ea\u70b9\u6570\u91cf-1\r\ntype\r\n  SnowNode = record\r\n  Point: TPoint; \/\/ \u96ea\u70b9\u4f4d\u7f6e\r\n  Color: Integer; \/\/ \u5148\u524d\u989c\u8272\r\n  Speed: Integer; \/\/ \u4e0b\u843d\u901f\u7387\r\n  nMove: Integer; \/\/ \u4e0b\u843d\u8ddd\u79bb\r\n  Stick: Integer; \/\/ '\u7c98\u8fde'\u5ea6\r\nend;\r\nvar\r\n  SnowNodes: array&#x5B;0..SnowNumber] of SnowNode; \/\/ \u96ea\u70b9\u6570\u7ec4\r\n  hTimer: Integer; \/\/ '\u968f\u673a\u98ce\u5411'\u65f6\u949f\u53e5\u67c4\r\n  CrWind: Integer; \/\/ \u5f53\u524d'\u98ce\u5411' ( -1 ~ 1 )\r\n  CrStep: Integer; \/\/ \u5f53\u524d\u5faa\u73af\u6b65\u6570(\u7528\u4e8e\u9650\u901f)\r\n  ScreenWidth, ScreenHeight: Integer; \/\/ \u5c4f\u5e55\u5c3a\u5bf8\r\n\r\n\/\/ \u53d6\u5c4f\u5e55\u5c3a\u5bf8 -&gt; ScreenWidth, ScreenHeight\r\nprocedure GetScreenSize;\r\nbegin\r\n  ScreenWidth := GetSystemMetrics(SM_CXSCREEN);\r\n  ScreenHeight := GetSystemMetrics(SM_CYSCREEN);\r\nend;\r\n\r\n\/\/ '\u968f\u673a\u98ce\u5411'\u65f6\u949f\r\nprocedure TimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD); stdcall;\r\nbegin\r\n  SetTimer(0, hTimer, (Random(27)+4) * 500, @TimerProc); \/\/ \u91cd\u8bbe\u4e0b\u6b21\u98ce\u5411\u6539\u53d8\u65f6\u95f4\r\n  if (CrWind &lt;&gt; 0) then CrWind := 0 else CrWind := Random(3) - 1; \/\/ \u4fee\u6539\u98ce\u5411\r\nend;\r\n\r\n\/\/ \u521d\u59cb\u5316\u96ea\u70b9\u6570\u7ec4\r\nprocedure InitSnowNodes;\r\nvar\r\n  hScreenDc, J: Integer;\r\nbegin\r\n  hScreenDc := CreateDC('DISPLAY', nil, nil, nil);\r\n  for J := 0 to SnowNumber do\r\n  begin\r\n    SnowNodes&#x5B;J].Point.X := Random(ScreenWidth);\r\n    SnowNodes&#x5B;J].Point.Y := Random(ScreenHeight);\r\n    SnowNodes&#x5B;J].Color := GetPixel(hScreenDc, SnowNodes&#x5B;J].Point.X, SnowNodes&#x5B;J].Point.Y);\r\n    SnowNodes&#x5B;J].Speed := Random(5) + 1; \/\/ \u51e0\u6b21\u5faa\u73af\u4f5c\u4e0b\u843d\u4e00\u6b21 (1~5)\r\n    SnowNodes&#x5B;J].nMove := Random(SnowNodes&#x5B;J].Speed)+1; \/\/ \u6bcf\u6b21\u4e0b\u843d\u8ddd\u79bb(1~5)\r\n    SnowNodes&#x5B;J].Stick := 30 - Random(SnowNodes&#x5B;J].Speed); \/\/ '\u7c98\u8fde'\u5ea6(\u51e0\u6b21\u5faa\u73af\u4f5c\u4e00\u6b21\u7c98\u8fde\u5224\u65ad)\r\n  end;\r\n  DeleteDC(hScreenDc);\r\nend;\r\n\r\n\/\/ \u79fb\u52a8\u96ea\u70b9 ..\r\nprocedure MoveSnowNodes;\r\nvar\r\n  hScreenDc, I, X, Y: Integer;\r\nbegin\r\n  hScreenDc := CreateDC('DISPLAY', nil, nil, nil);\r\n  for I := 0 to SnowNumber do\r\n  begin\r\n  \/\/ \u63a7\u5236\u96ea\u70b9\u4e0b\u964d\u901f\u7387\r\n    if (CrStep mod SnowNodes&#x5B;I].Speed) &lt;&gt; 0 then Continue;\r\n    \/\/ \u6062\u590d\u4e0a\u6b21\u88ab\u8986\u76d6\u70b9\r\n    if GetPixel(hScreenDc, SnowNodes&#x5B;I].Point.X, SnowNodes&#x5B;I].Point.Y) = $FFFFFF then\r\n    SetPixel(hScreenDc, SnowNodes&#x5B;I].Point.X, SnowNodes&#x5B;I].Point.Y, SnowNodes&#x5B;I].Color);\r\n    \/\/ \u6839\u636e\u98ce\u5411\u4f5c\u968f\u673a\u98d8\u843d\r\n    X := SnowNodes&#x5B;I].Point.X + Random(3) - 1 + CrWind;\r\n    Y := SnowNodes&#x5B;I].Point.Y + SnowNodes&#x5B;I].nMove;\r\n    \/\/ \u79ef\u96ea(\u505c\u7559)\u6548\u679c\u5904\u7406\r\n    if ( (CrStep mod SnowNodes&#x5B;I].Stick) = 0 ) \/\/ \u964d\u4f4e\u79ef\u96ea\u6982\u7387 ..\r\n    and ( GetPixel(hScreenDc, X, Y) &lt;&gt; GetPixel(hScreenDc, X, Y+1) ) \/\/ '\u8fb9\u7f18'\u5224\u65ad\r\n    and ( GetPixel(hScreenDc, X-1, Y) &lt;&gt; GetPixel(hScreenDc, X-1, Y+1) )\r\n    and ( GetPixel(hScreenDc, X+1, Y) &lt;&gt; GetPixel(hScreenDc, X+1, Y+1) ) then\r\n    begin\r\n        \/\/ \u7a0d\u5fae\u8c03\u6574\u5750\u6807\r\n        if GetPixel(hScreenDc, X, Y-1) = GetPixel(hScreenDc, X, Y-2) then Dec(Y) \/\/ \u4e0a\u8fb9\u7f18\r\n        else if GetPixel(hScreenDc, X, Y+1) = GetPixel(hScreenDc, X, Y+2) then Inc(Y); \/\/ \u4e0b\u8fb9\u7f18\r\n        Inc(X, CrWind);\r\n        \/\/ \u753b\u4e09\u4e2a\u70b9(\u96ea\u82b1)\r\n        SetPixel(hScreenDc, X, Y, $FFFFFF);\r\n        SetPixel(hScreenDc, X+1, Y+1, $FFFFFF);\r\n        SetPixel(hScreenDc, X-1, Y+1, $FFFFFF);\r\n        \/\/ \u91cd\u751f\u96ea\u70b9\r\n        SnowNodes&#x5B;I].Point.Y := Random(10);\r\n        SnowNodes&#x5B;I].Point.X := Random(ScreenWidth);\r\n        SnowNodes&#x5B;I].Color := GetPixel(hScreenDc, SnowNodes&#x5B;I].Point.X, SnowNodes&#x5B;I].Point.Y);\r\n        end else\r\n        begin\r\n          if (X &lt; 0) or (X &gt; ScreenWidth) or (Y &gt; ScreenHeight) then \/\/ \u8d85\u51fa\u8303\u56f4\u5219\u91cd\u751f\u96ea\u70b9\r\n          begin\r\n            SnowNodes&#x5B;I].Point.Y := Random(10);\r\n            SnowNodes&#x5B;I].Point.X := Random(ScreenWidth);\r\n            SnowNodes&#x5B;I].Color := GetPixel(hScreenDc, SnowNodes&#x5B;I].Point.X, SnowNodes&#x5B;I].Point.Y);\r\n          end else\r\n          begin\r\n          \/\/ \u4fdd\u5b58\u989c\u8272\u5e76\u7ed8\u5236\u96ea\u70b9\r\n          SnowNodes&#x5B;I].Color := GetPixel(hScreenDc, X, Y);\r\n          SetPixel(hScreenDc, X, Y, $FFFFFF);\r\n          \/\/ \u6b64\u65f6\u4fdd\u5b58\u65b0\u96ea\u70b9\u4f4d\u7f6e\r\n          SnowNodes&#x5B;I].Point.X := X;\r\n          SnowNodes&#x5B;I].Point.Y := Y;\r\n          end;\r\n        end;\r\n    end;\r\n    DeleteDC(hScreenDc);\r\n    Inc(CrStep);\r\nend;\r\n\r\nvar\r\n  ThreadMsg: TMsg; \/\/ \u6807\u51c6\u6d88\u606f\u7ed3\u6784\u4f53\r\n  Frequency: Int64; \/\/ \u9ad8\u6027\u80fd\u5b9a\u65f6\u5668\u9891\u7387\r\n  StartCt, EndCt: Int64; \/\/ \u9ad8\u6027\u80fd\u5b9a\u65f6\u5668\u8ba1\u6570\r\n  ElapsedTime: Extended; \/\/ \u65f6\u95f4\u95f4\u9694\r\nbegin\r\n  Randomize; GetScreenSize; InitSnowNodes; \/\/ \u521d\u59cb\u5316\r\n  QueryPerformanceFrequency(Frequency); \/\/ \u9ad8\u6027\u80fd\u5b9a\u65f6\u5668\u9891\u7387\r\n  hTimer := SetTimer(0, 0, Random(5)*500, @TimerProc); \/\/ \u5b89\u88c5\u968f\u673a\u98ce\u5411\u5b9a\u65f6\u5668\r\n  RegisterHotKey(0, 0, MOD_CONTROL, ORD('L')); \/\/ \u6ce8\u518c\u9000\u51fa\u70ed\u952e Ctrl+L\r\n  while TRUE do \/\/ \u6d88\u606f\u5faa\u73af\r\n  begin\r\n     QueryPerformanceCounter(StartCt); \/\/ \u6267\u884c\u8fd0\u7b97\u524d \u8ba1\u6570\u503c\r\n     if PeekMessage(ThreadMsg, 0, 0, 0, PM_REMOVE) then \/\/ \u53d6\u5230\u6d88\u606f\r\n    begin\r\n      case ThreadMsg.message of\r\n      WM_TIMER:\r\n        TimerProc(0, 0, 0, 0); \/\/ \u9884\u8bbe\u98ce\u5411\u6539\u53d8\u65f6\u95f4\u5df2\u5230\r\n      WM_HOTKEY:\r\n      begin\r\n        KillTimer(0, hTimer); \/\/ \u5220\u9664\u968f\u673a\u98ce\u5411\u5b9a\u65f6\u5668\r\n        UnregisterHotKey(0, 0); \/\/ \u5220\u9664\u9000\u51fa\u70ed\u952e Ctrl+L\r\n        InvalidateRect(0, nil, TRUE); \/\/ \u5237\u65b0\u5c4f\u5e55\r\n        Break; \/\/ \u8df3\u51fa\u6d88\u606f\u5faa\u73af\r\n      end;\r\n      WM_DISPLAYCHANGE:\r\n      begin\r\n        GetScreenSize; \/\/ \u91cd\u65b0\u53d6\u5c4f\u5e55\u5c3a\u5bf8\r\n        InitSnowNodes; \/\/ \u521d\u59cb\u5316\u96ea\u70b9\u6570\u7ec4\r\n      end;\r\nend;\r\nend;\r\n  MoveSnowNodes; \/\/ \u79fb\u52a8\u96ea\u70b9\r\n  QueryPerformanceCounter(EndCt); \/\/ \u6267\u884c\u8fd0\u7b97\u540e\u8ba1\u6570\u503c\r\n  ElapsedTime := (EndCt-StartCt)\/Frequency;\r\n  if (ElapsedTime &lt; 0.0005) then Sleep(2) \/\/ \u7b80\u5355\u9650\u901f\r\n  else if (ElapsedTime &lt; 0.0010) then Sleep(1)\r\n  else if (ElapsedTime &lt; 0.0015) then Sleep(0);\r\nend;\r\nend.\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>program Snow; uses Windows, Messages; const SnowNumber  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-482","post","type-post","status-publish","format-standard","hentry","category-code_related"],"_links":{"self":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/comments?post=482"}],"version-history":[{"count":1,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/482\/revisions"}],"predecessor-version":[{"id":4742,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/482\/revisions\/4742"}],"wp:attachment":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/media?parent=482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/categories?post=482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/tags?post=482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}