Red de conocimiento informático - Conocimientos de programación - Código fuente del programa exquisito

Código fuente del programa exquisito

# incluir & ltiostream.h & gt

# incluir & ltwindows.h & gt

# incluir & ltmath.h & gt

# incluir & ltstdlib. h & gt

#Definir ID_TIMER 1

#Definir SNOWNUM 500 //El número de copos de nieve

#Definir contraste 50 //Contraste

#define YSTART 5 //Se utiliza para determinar la coordenada Y inicial del copo de nieve.

#Define Snowflake Cr RGB (0xff, 0xff, 0xff)//El color del copo de nieve es blanco.

# define snowpathercr RGB (0xdb, 0xdb, 0x ff)//El color de los copos de nieve acumulados

etiqueta de estructura typedef

{

PUNTO ptSnowsPos[SNOWNUM]; //Se utiliza para guardar las coordenadas de cada copo de nieve.

COLORREF crOrg[SNOWNUM] //El color original de la pantalla antes de dibujar los copos de nieve.

int iVx, iVy, iAllVx, iAllVy

}Nieve;

void initSnow(HDC hdc, Snow *sn, int iSnow, int CX screen);

int GetContrast(HDC hdc, Snow *sn, int es ahora

void drawSnow(HDC hdc, Snow *sn, int CX screen

LRESULT devolución de llamada WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(h instancia h instancia, HINSTANCE hPrevInstance,

Centro Internacional de Exposiciones de Shenzhen PSTR

{

estático TCHAR szapname[]= TEXT(" clsdesknow ");

HWND hwnd

MSG MSG;

WNDCLASS wndclass

clase wnd = CS _ HREDRAW | CS _ VREDRAW;

wndclass.lpfnWndProc = WndProc

clase wnd >

clase wnd .cbwndextra = 0;

clase h. instancia = h

wndclass.hIcon = LoadIcon (NULL, IDI_Application); p>clase wnd . hcursor = cargar cursor(NULL, IDC _ ARROW);

clase wnd = (HBRUSH)GetStockObject(WHITE _ BRUSH);

wndclass .lpszMenuName = NULL

wnd class . lpszclassname = SZ nombre de aplicación;

if (!register class(& wndclass))

{

MessageBox (NULL, TEXT("¡Este programa requiere Windows NT! "), szAppName, MB _ error de icono);

Devuelve 0;

}

Hwnd = createwindow (szappname, text("Nieve en el escritorio" ),

WS_MINIMIZEBOX | WS_SYSMENU,

CW_USEDEFAULT, CW_USEDEFAULT,

240, 120,

NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, icmd show);

Actualizar ventana (hwnd);

while(GetMessage(& msg, NULL, 0, 0 ))

{

Traducir mensaje(&MSG);

enviar mensaje(&MSG);

}

}

p>

Devolver msg.wParam

}

Devolución de llamada LRESULT WndProc (HWND hwnd, mensaje UINT, WPARAM wParam, LPARAM lPara

m)

{

HDC hdc

PAINTSTRUCT ps

rectángulo RECT;

static int cxScreen, cyScreen //Ancho y alto de la pantalla (unidad: píxeles)

Static int iTimes, ILO optimes = 100;

Nieve estática ventisquero;

int I;

Cambiar (mensaje)

{

Caso WM_CREATE:

Pantalla CX = GetSystemMetrics(pantalla SM _ CX);

cy screen = GetSystemMetrics(SM _ cy screen);

srand((int)GetCurrentTime()); //Inicializa el generador de números aleatorios

snow dream . unsigned)rand()% 3-1; //La velocidad general de deriva horizontal de los copos de nieve (-1, 0, 1)

snow dream . //La velocidad de caída vertical general del copo de nieve (1, 2)

hdc = GetDC(NULL); //Recupera el contexto del dispositivo de toda la pantalla.

for(I = 0; i & ltSNOWNUMi++)

{

snowDream.ptSnowsPos[i]. x = rand()% CX screen; //La coordenada x donde comienzan a caer los copos de nieve.

snowDream.ptSnowsPos[i]. y = rand()% y start; //La coordenada Y donde comienzan a caer los copos de nieve.

sueño de nieve . crorg[I]= get pixel(hdc, snowDream.ptSnowsPos[i].x,

snowDream.ptSnowsPos[i].y // llegar a); El valor del color bruto del punto fijo.

}

ReleaseDC(NULL, hdc);

SetTimer(hwnd, ID_TIMER, 10, NULL); //Temporizador, 10 milisegundos

Devuelve 0;

Qué sucede cuando cambia la resolución de la pantalla WM_DISPLAYCHANGE: //.

Pantalla CX = GetSystemMetrics(pantalla SM _ CX);

pantalla cy = GetSystemMetrics(pantalla SM _ cy);

Caso WM_TIMER:

hdc = GetDC(NULL); //Recupera el contexto del dispositivo de toda la pantalla.

if(iTimes>iLoopTimes)

{

iTimes = 0;

iLoopTimes = 50 + (sin firmar) rand ()% 50;

if(snowDream.iAllVx!= 0)

sueño de nieve . ial lvx = 0;

Otros

sueño de nieve. ialvx =(unsigned)rand()% 3-1; //La velocidad general de deriva horizontal de los copos de nieve (-1, 0, 1)

snow dream . 2+1; //La velocidad de caída vertical general de los copos de nieve (1, 2)

}

Otros

itimes++;

dibujar nieve (hdc y snowDream, pantalla CX);

ReleaseDC(NULL, hdc);

Devuelve 0;

Caso WM_PAINT:

p>

hdc = comenzar pintura(hwnd & PS);

GetClientRect(hwnd &rect);

DrawText (hdc, Text("Está nevando en el escritorio "), -1, & amprect,

DT_single line | DT_CENTER | DT_VCENTER);

Revestimiento final (hwnd & PS);

Devuelve 0;

Caso WM_DESTROY:

KillTimer(hwnd, ID_TIMER); //Detiene el temporizador

invalidatory(NULL , NULL, TRUE); // Actualiza el escritorio

PostQuitMessage(0);

Devuelve 0;

}

Devuelve DefWindowProc (hwnd, mensaje, wParam, lParam); p>

}

Void init snow (hdchdc, snow * sn, int iSnow, int CX screen) // Inicializa iSnow copo de nieve.

{

sn-& gt;ptSnowsPos[iSnow]. x = (unsigned) rand()% CX screen; //x abarca todo el ancho de la pantalla

sn->ptSnowsPos[iSnow]. y = (unsigned) rand()% y start; // El rango y está dentro de los píxeles YSTART en la parte superior de la pantalla.

sn->crOrg[iSnow] = GetPixel(hdc, sn->ptSnowsPos[iSnow].x,

sn->ptSnowsPos[iSnow]. y); //Obtiene el valor de color original del punto dado.

}

int GetContrast(HDC hdc, Snow *sn, int iSnow)

{

int iR, iG, iB;

COLORREF crCmp

if(0 = = sn-& gt; IVx) //Si la velocidad horizontal es 0, toma el punto directamente debajo de ella que sea un píxel más grande que él .

crCmp = GetPixel(hdc, sn-> ptSnowsPos[iSnow]. x, sn-> ptSnowsPos[iSnow].

y+1);

De lo contrario //Si la velocidad horizontal > 0, toma la esquina inferior derecha. & lt0 significa la esquina inferior izquierda.

crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow]. x+(sn->iVx>0?1:-1), sn->ptSnowsPos[iSnow]. y+1);

If(crCmp==SNOWCR) //Si es el color de los copos de nieve,

devuelve 0;

//Obtén crCmp y compara la diferencia entre las partes azul, verde y roja del punto.

iB = ABS((crCmp>>16);0x ff-(sn->crOrg[ahora]>>16);0x ff);

iG = ABS( (crCmp>>8)&0x ff-(sn->crOrg[ahora]>>8)&0x ff);

iR = abs((crCmp)&.0xff-(sn ->crOrg[is now])&0xff);

return(iR+iG+iB)/3 ;

}

void drawSnow( HDC hdc, Snow *sn, int cxScreen)

{

int I;

for(I = 0;i<SNOWNUMi++)

{

//Si el color original guardado no es el color del copo de nieve.

if(sn-> Kroger[i]!= SNOWCR)

SetPixel(hdc, sn->ptSnowsPos[i].x, sn-> gt;ptSnowsPos [i].y,

sn->crOrg[i]); //Restaura el color de la última posición.

sn-& gt;iVx = sn-& gt;ialvx *(I % 3+1); //Velocidad de aleteo de los copos de nieve en dirección X

sn-& gt; iVy = sn-& gt;ialvy *(I % 3+1); //La velocidad de aleteo de los copos de nieve en la dirección y

//rand()%5-2 hace que los copos de nieve tiemblen cuando caen .

sn-& gt;ptSnowsPos[i]. x+= sn-& gt;iVx+rand()% 5-2; //La siguiente coordenada x del copo de nieve

sn-& gt;ptSnowsPos[i]. y+= sn->ivy+1; //La siguiente coordenada Y del copo de nieve

//Obtiene el valor de color original del punto dado.

sn->crOrg[i] = GetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y);

if(CLR _ INVALID = = sn-& gt; CrOrg[i]) //Si falla la recopilación de colores, los copos de nieve saldrán flotando de la pantalla.

{

initSnow(hdc, sn, I, CX screen); //Reinicializar copo de nieve

Continuar;

}< / p>

if(sn-> krog[i]!= SNOWCR) //Si el color del punto actual no es igual al color del copo de nieve.

{

if(snowgatherecr = = sn-& gt; CrOrg[i]) //El color del punto actual = el color de la nieve.

{//Ajusta el color de los copos de nieve.

SetPixel(hdc, sn-> ptSnowsPos[i].

x, sn->ptSnowsPos[i]. y, SNOWCR);

sn-& gt; crOrg[I]= snow Cr;

//initSnow(hdc, sn, I, CX screen);

}

else if(GetContrast(hdc, sn, I)>50) //Si contraste>50

{//Copo de nieve apilado

SetPixel(hdc, sn-& gt; ptSnowsPos[i]. x, sn-& gt; ptSnowsPos[i]. y, snowgatherecr);

SetPixel(hdc, sn- & gt ; ptSnowsPos[i]. sn->ptSnowsPos[i].y+1,snowgatherecr);

initSnow(hdc, sn, I, CX screen); //Reinicializar copos de nieve

}

De lo contrario // contraste < 50, dibuja este marco para que los copos de nieve no se acumulen. Espere hasta la próxima para restaurar el color original de este punto y producir un efecto deslumbrante.

SetPixel(hdc, sn-& gt; ptSnowsPos[i]. x, sn-& gt; ptSnowsPos[i]. y, SNOWCR

}

);

}

Este es un programa de nieve de escritorio que modifiqué basándose en Internet. También puedo construir un nuevo win32 en vc6.0, espero que pueda ayudarte un poco.

}