(*
Project: Dead TV Effect
Original C++ Source: http://www.up.poznan.pl/~rjk/pages/ozdgk/3_4.html
Ported to Delphi by: Sn!per X ^ AT4RE
Code Type: Delphi / WinAPI
Release Date: 2015-11-22
*)
program DeadTVEffect;
uses Windows, Messages;
const
g_strKlasaOkna = 'deadtveffect_window';
ZMIENNOSC = 2500;
var
g_hdcOkno: HDC; // uchwyt kontekstu urzadzenia okna
rcObszarKlienta: TRECT;
procedure Pracuj();
var
ptPiksel: TPOINT;
byOdcien: BYTE;
i: Integer;
begin
// wybieramy pewna ilosc pikseli i zmieniamy ich kolory
i := 0;
while i < ZMIENNOSC do
begin
Inc(i);
// losujemy wspَlrzedne zmienianego piksela
ptPiksel.x := Random(rcObszarKlienta.right);
ptPiksel.y := Random(rcObszarKlienta.bottom);
// losujemy odcien szarosci
byOdcien := Random(256);
// zmieniamy piksel
SetPixelV(g_hdcOkno, ptPiksel.x, ptPiksel.y, RGB(byOdcien, byOdcien,
byOdcien));
end;
end;
function WindowEventProc(hWnd, uMsg: Longint; wParam: WPARAM; lParam: LPARAM):
Longint; stdcall;
begin
Result := 0;
case uMsg of
WM_TIMER:
begin
Pracuj();
Result := 0;
end;
WM_DESTROY:
begin
KillTimer(hWnd, 0);
PostQuitMessage(0);
Result := 0;
end;
end;
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;
var
KlasaOkna: WNDCLASSEX;
hOkno: HWND;
msgKomunikat: MSG;
begin
ZeroMemory(@KlasaOkna, sizeof(WNDCLASSEX));
KlasaOkna.cbSize := sizeof(WNDCLASSEX);
KlasaOkna.hInstance := hInstance;
KlasaOkna.lpfnWndProc := @WindowEventProc;
KlasaOkna.lpszClassName := g_strKlasaOkna;
KlasaOkna.hCursor := LoadCursor(0, IDC_ARROW);
KlasaOkna.hIcon := LoadIcon(0, IDI_APPLICATION);
KlasaOkna.hbrBackground := GetStockObject(WHITE_BRUSH);
KlasaOkna.style := CS_OWNDC // wlasny kontekst urzadzenia okna
or CS_HREDRAW or CS_VREDRAW;
// rejestrujemy klase okna
RegisterClassEx(KlasaOkna);
hOkno := CreateWindow(
g_strKlasaOkna,
'Dead TV Effect',
WS_SYSMENU or WS_CAPTION or WS_BORDER or WS_OVERLAPPED or WS_VISIBLE or
WS_MINIMIZEBOX,
CW_USEDEFAULT,
0,
320 + 2,
200 + 16 + 2,
0,
0,
hInstance,
0);
GetClientRect(hOkno, rcObszarKlienta);
ShowWindow(hOkno, SW_SHOW);
UpdateWindow(hOkno);
g_hdcOkno := GetDC(hOkno);
// ustawiamy mu elastyczny pedzel
DeleteObject(SelectObject(g_hdcOkno, GetStockObject(DC_BRUSH)));
SetTimer(hOkno, 1, 40, nil);
while (GetMessage(msgKomunikat, 0, 0, 0)) do
begin
TranslateMessage(msgKomunikat);
DispatchMessage(msgKomunikat);
end;
end.