Magda wszytkich pozdrawia!!! Siema jestem początkującą programistką i proszę o pomoc!! A otóż mam problem z skompilowaniem wygaszacza ekranu, kumpela dała mi kod do C i mam tylko Turbo C. Jak to skompilować i czy potrezebne są mi te biblioteki co są na samej górze i skąd je wziąć?? Serdeczne dzięki za wszystko!!
A oto kod:
#include <windows.h>
#include <commctrl.h>
#include <scrnsave.h>
/* Typ opisujacy pojedyncza gwiazdkie sniegu, x,y to jej srodek,
k kolor, w typ 0 najmniejsza */
typedef struct STAR
{
COLORREF k;
long x,y; // wspolrzedne gwiazdki
long dx, dy; // wspolczynniki przesuniecia
long kr; // liczba krokow
long w ;
} STAR;
long IleStar; // Liczba gwiazdek
long RozneKolory; // nie zero to gwiazdki w roznych koloryach
#define IleStarMax 500
#define NazwaKlucza "SOFTWARE\ProgramyAdama\WygaszaczPadaSnieg"
long predkosc, iSzerokosc, iWysokosc;
long lIleJest;
BOOL bUsuwamy;
STAR tg[IleStarMax+2];
UINT uTimer;
void PutStar(HDC kont, STAR w);
void RysujWygaszacz(HDC kont);
COLORREF LosujKolor();
// Rysuje platek sniegu, narazietrzy typy
void PutStar(HDC kont, STAR w)
{
long i;
switch (w.w)
{
case 0: SetPixel(kont,w.x, w.y, w.k); break;
case 1:
{
SetPixel(kont,w.x, w.y, w.k);
SetPixel(kont, w.x+1,w.y+1, w.k); SetPixel(kont, w.x-1, w.y+1, w.k);
SetPixel(kont, w.x-1, w.y-1, w.k); SetPixel(kont, w.x+1, w.y-1, w.k);
break;
}
case 2:
{
SetPixel(kont,w.x, w.y, w.k);
SetPixel(kont, w.x+1,w.y+1, w.k); SetPixel(kont, w.x-1, w.y+1, w.k);
SetPixel(kont, w.x-1, w.y-1, w.k); SetPixel(kont, w.x+1, w.y-1, w.k);
SetPixel(kont, w.x+2, w.y+2, w.k); SetPixel(kont, w.x-2, w.y+2, w.k);
SetPixel(kont, w.x-2, w.y-2, w.k); SetPixel(kont, w.x+2, w.y-2, w.k);
break;
}
case 3:
{
// Mala gwiazdka, najpierw linia pozioma
for (i=w.x-3; i<=(w.x+4); i++) SetPixel(kont, i, w.y, w.k);
SetPixel(kont, w.x, w.y-1, w.k); SetPixel(kont, w.x+1, w.y-1, w.k);
SetPixel(kont, w.x-1, w.y-2, w.k); SetPixel(kont, w.x+2, w.y-2, w.k);
SetPixel(kont, w.x-1, w.y-3, w.k); SetPixel(kont, w.x+2, w.y-3, w.k);
SetPixel(kont, w.x-2, w.y-4, w.k); SetPixel(kont, w.x+3, w.y-4, w.k);
SetPixel(kont, w.x, w.y+1, w.k); SetPixel(kont, w.x+1, w.y+1, w.k);
SetPixel(kont, w.x-1, w.y+2, w.k); SetPixel(kont, w.x+2, w.y+2, w.k);
SetPixel(kont, w.x-1, w.y+3, w.k); SetPixel(kont, w.x+2, w.y+3, w.k);
SetPixel(kont, w.x-2, w.y+4, w.k); SetPixel(kont, w.x+3, w.y+4, w.k);
break;
}
case 4:
{
// troche wieksza gwiazdka
for (i=w.x-5; i<=(w.x+5); i++) SetPixel(kont, i, w.y, w.k);
//Teraz cztery symetryczne ramiona
SetPixel(kont, w.x-1, w.y-1, w.k); SetPixel(kont, w.x-2, w.y-2, w.k);
SetPixel(kont, w.x-2, w.y-3, w.k); SetPixel(kont, w.x-3, w.y-4, w.k);
SetPixel(kont, w.x+1, w.y-1, w.k); SetPixel(kont, w.x+2, w.y-2, w.k);
SetPixel(kont, w.x+2, w.y-3, w.k); SetPixel(kont, w.x+3, w.y-4, w.k);
SetPixel(kont, w.x-1, w.y+1, w.k); SetPixel(kont, w.x-2, w.y+2, w.k);
SetPixel(kont, w.x-2, w.y+3, w.k); SetPixel(kont, w.x-3, w.y+4, w.k);
SetPixel(kont, w.x+1, w.y+1, w.k); SetPixel(kont, w.x+2, w.y+2, w.k);
SetPixel(kont, w.x+2, w.y+3, w.k); SetPixel(kont, w.x+3, w.y+4, w.k);
break;
}
}
}
void Odczytaj();
void Zapisz();
// Procedura dialogu konfiguracyjnego
BOOL WINAPI ScreenSaverConfigureDialog(HWND dialog,
UINT komunikat, WPARAM wParam, LPARAM lParam)
{
switch(komunikat)
{
case WM_INITDIALOG:
// Odczytaj prędkość z rejestru
Odczytaj();
// Ustaw zakres paska przesuwnego na 0-20
SendDlgItemMessage(dialog, 110, TBM_SETRANGE, TRUE, MAKELONG(1,20));
// Ustaw pozycję suwaka zależnie od prędkości
SendDlgItemMessage(dialog, 110, TBM_SETPOS, (WPARAM)TRUE, predkosc);
// Ustaw zakres paska przesuwnego na 5-500
SendDlgItemMessage(dialog, 111, TBM_SETRANGE, TRUE, MAKELONG(5,500));
// Ustaw pozycję suwaka zależnie od prędkości
SendDlgItemMessage(dialog, 111, TBM_SETPOS, (WPARAM)TRUE, IleStar);
if (RozneKolory!=0) CheckDlgButton(dialog, 113, BST_CHECKED);
else CheckDlgButton(dialog, 113, BST_UNCHECKED);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
predkosc = SendDlgItemMessage(dialog, 110, TBM_GETPOS, 0, 0);
IleStar = SendDlgItemMessage(dialog, 111, TBM_GETPOS, 0, 0);
if (IsDlgButtonChecked(dialog, 113)==BST_CHECKED) RozneKolory=1;
else RozneKolory=0;
// Zapisz prędkość do rejestru
Zapisz();
EndDialog(dialog, TRUE);
case IDCANCEL:
EndDialog(dialog, FALSE);
return TRUE;
case 112:
MessageBox(dialog,"Ten program jest prostym wygaszaczem ekranu. \n Może być w dowolny sposób kopiowany i rozpowszechniany.\n Autor: Adam Kowalczyk. [email protected]", "O Wygaszaczu...", 0);
return FALSE;
}
}
return FALSE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
InitCommonControls();
return TRUE;
}
LONG WINAPI ScreenSaverProc(HWND okno, UINT komunikat, WPARAM wParam, LPARAM lParam)
{
HDC kont;
RECT prost;
int i;
switch(komunikat)
{
case WM_CREATE:
{
Odczytaj();
/* Włącz zegar generujący komunikaty WM_TIMER co okres czasu = prędkość*1/10 [sek] */
iSzerokosc=GetSystemMetrics(SM_CXSCREEN);
iWysokosc=GetSystemMetrics(SM_CYSCREEN);
lIleJest=0;
bUsuwamy=0;
uTimer = SetTimer(okno, 1, 50, NULL);
break;
}
case WM_TIMER:
{
HPEN poppioro, pioro;
int x,y;
kont = GetDC(okno);
// Tu rysujemy gwiazdki
RysujWygaszacz(kont);
ReleaseDC(okno,kont);
break;
}
case WM_DESTROY:
if (uTimer) KillTimer(okno, uTimer);
break;
}
return DefScreenSaverProc(okno, komunikat, wParam, lParam);
}
// Funkcja odczytuje prędkość wygaszacza z rejestru
void Odczytaj()
{
HKEY klucz;
DWORD rozm = 4;
// Otwórz odpowiedni klucz rejestru
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NazwaKlucza, 0,
KEY_QUERY_VALUE, &klucz) == ERROR_SUCCESS)
{
// Odczytaj prędkość
RegQueryValueEx(klucz, "Prędkość", 0, NULL, (BYTE *)&predkosc, &rozm);
if(predkosc<0 || predkosc>20) predkosc = 2;
// Odczytaj liczbe gwiazd
RegQueryValueEx(klucz, "LiczbaGwiazd", 0, NULL, (LONG *)&IleStar, &rozm);
if (IleStar<5) IleStar=5;
if (IleStar>IleStarMax) IleStar=IleStarMax;
// Odczytaj czy zmiana kolorow
RegQueryValueEx(klucz, "RozneKolory", 0, NULL, (LONG *)&RozneKolory, &rozm);
// Zamknij otwarty klucz rejestru
RegCloseKey(klucz);
} else
{
IleStar=20;
predkosc = 5;
RozneKolory=1;
}
}
// Funkcja zapisuje prędkość wygaszacza do rejestru
void Zapisz()
{
HKEY klucz;
DWORD akcja;
// Otwórz odpowiedni klucz rejestru
RegCreateKeyEx(HKEY_LOCAL_MACHINE, NazwaKlucza , 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &klucz, &akcja);
// Zapisz informacje o prędkości
RegSetValueEx(klucz, "Prędkość", 0, REG_DWORD, (CONST BYTE *)&predkosc, 4);
// Zapisz informacje o liczbe gwiazd
RegSetValueEx(klucz, "LiczbaGwiazd", 0, REG_DWORD, (CONST BYTE *)&IleStar, 4);
RegSetValueEx(klucz, "RozneKolory", 0, REG_DWORD, (CONST BYTE *)&RozneKolory, 4);
// Zamknij otwarty klucz rejestru
RegCloseKey(klucz);
}
void RysujWygaszacz(HDC kont)
{
STAR w;
long i;
// w inicjacji rysuj nowe pola
if (bUsuwamy==0)
{
for(i=0; i<IleStar; i++)
{
// losujemy wspolrzedne gwiazdki, na gorze ekranu
w.x=rand() % iSzerokosc;
w.y=rand() % iWysokosc;
w.k=LosujKolor();
w.kr=rand()%20;
w.dx=rand() %3;
w.dy=rand() %3;
w.w=rand() %5;
PutStar(kont, w);
tg[i]=w;
}
bUsuwamy=1;
} else
{
// zmieniamu polozenie gwiazdek
for(i=0; i<IleStar; i++)
{
w=tg[i];
// usuniecie poprzedniego punktu
w.k=0;
PutStar(kont, w);
// przesuniecie w dol i w ktoras ze stron,
w.y+=predkosc+w.dy;
w.kr--;
w.x+=(w.dx-1);
if (w.kr<0)
{
w.kr=rand() %20;
//w.x+=((rand() % 5)-2);
w.dx=rand() %4;
}
// usuniecie jak poza eranem
if ((w.x<0)||(w.y<0)||(w.x>iSzerokosc)||(w.y>iWysokosc))
{
// losujemy wspolrzedne gwiazdki, na gorze ekranu
w.x=rand() % iSzerokosc;
w.y=rand() % 20;
w.k=LosujKolor();
w.kr=rand() %20;
w.dx=rand() %3;
w.dy=rand() %3;
w.w=rand() %5;
}
else
{
w.k=tg[i].k;
}
// narysuj nowa gwiazdkie
PutStar(kont, w);
tg[i]=w;
}
}
}
/* Funkcja losuje kolor. Ale tak ze jest zawsze jakas skladowa koloru jasna.
Taki uklad zapewnia zawsze zywe kolory. */
COLORREF LosujKolor()
{
unsigned char r,g,b;
long k;
COLORREF ret;
if (RozneKolory==0) return (RGB(255,255,255));
r=150+rand()%106;
g=150+rand()%106;
b=150+rand()%106;
k=rand()%6;
if (k==0) r=rand()%256;
else
if (k==1) g=rand()%256;
else
if (k==2) b=rand()%256;
else
if (k==3) {
r=rand()%256;
b=rand()%256;
}
else
if (k==4) {
b=rand()%256;
g=rand()%256;
}
else
{
r=rand()%256;
g=rand()%256;
}
ret=RGB(r,g,b);
return ret;
}