Red de conocimiento informático - Conocimiento informático - Código fuente genuino del mini programa

Código fuente genuino del mini programa

# incluir ltiostream.h gt

# incluir ltwindows.h gt

# incluir ltmath.h gt

# incluir ltstdlib.h gt

#Define ID_TIMER 1

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

#Define contraste 50 //Contraste

#define YSTART 5 // Utilice 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(amp;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(amp;msg,NULL,0,0) )

{

Traducir mensaje (y MSG);

mensaje de envío (y MSG);

>}

Devolver msg.wParam

}

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

{

HDC hdc

PAINTSTRUCT ps

RECT rectángulo;

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

static int iTimes, ILO optimes = 100;

nieve estática

int I

interruptor (mensaje); )

{

Caso WM_CREATE:

CX screen = GetSystemMetrics(SM_CX screen);

cy screen = GetSystemMetrics( SM _ cy screen);

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

snow dream . /La velocidad general de deriva horizontal de los copos de nieve (-1, 0, 1)

snow dream .alvy =(unsigned)rand() 2 1 //La velocidad general de caída vertical de los copos 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 los copos de nieve comienzan a caer.

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 gt;iLoopTimes)

{

iTimes = 0;

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

if(snowDream.iAllVx!= 0)

sueño de nieve . ial lvx = 0;

Otro

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 . //La velocidad general de caída vertical de los copos de nieve (1, 2)

}

Otros

itimes;

draw snow(hdc amp; snowDream, pantalla CX);

ReleaseDC(NULL, hdc)

Caso WM_PAINT:

hdc; = comenzar pintura(hwnd amp; PS);

GetClientRect(hwnd amp; rect

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

DT _ línea única | DT _ CENTER | DT _ VCENTER

Revestimiento superior (hwnd amp; PS);

p>

Caso WM_DESTROY:

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

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

PostQuitMessage(0);

Devuelve 0;

}

Devuelve DefWindowProc (hwnd, message, wParam , lParam);

}

p>

}

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

{

sngt;ptSnowsPos[iSnow]. x = (unsigned) rand() CX screen; //x abarca todo el ancho de la pantalla

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

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

sn- gt; 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 ella.

crCmp = GetPixel(hdc, sn- gt; ptSnowsPos[iSnow]. x, sn- gt; ptSnowsPos[iSnow]. y 1);

Else //Si velocidad horizontal; >0, toma la esquina inferior derecha. lt0 representa la esquina inferior izquierda.

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

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

devuelve 0

//Obtiene crCmp y el punto de comparación azul y; Verde respectivamente, la diferencia en la parte roja.

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

iG = ABS); ((crCmp gt; gt8) amp; 0x ff - (sn- gt; crOrg[ahora] gt; gt8) amp; 0x ff-(sn- gt; crOrg[ahora]) amp;

return(iR iG iB)/3

}

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

{

int I;

for(I = 0; i ltSNOWNUMi)

{

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

if(sn-gt; krog[i]!= SNOWCR)

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

sn- gt; 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; ; 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.

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

ptSnowsPos[i]. y = sn-gt; ivy 1; //Siguiente coordenada Y del copo de nieve

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

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

); if(CLR_INVALID = = sn- gt; CrOrg[i]) //Si falla la recopilación de colores, los copos de nieve flotarán fuera de la pantalla.

{

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

Continuar;

}< / p>

if(sn- gt; 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- gt; ptSnowsPos[i]. x, sn- gt; ptSnowsPos[i]. y, SNOWCR

sn- gt; ]= nieve Cr;

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

}

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

{//copos de nieve apilados

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

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

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

initSnow(hdc , sn); , I, pantalla CX); //Reinicializa los 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.

}