El código fuente subyacente del subprograma
# 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 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 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
Devuelve 0
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
iR = abs((crCmp) and amp. 0x); ff-(sn- gt; crOrg[ahora]) amp; 0x ff);
return(iR iG iB)/3; void drawSnow(HDC hdc, Snow *sn, int cxScreen)
{
int I;
for(I = 0; i ltSNOWNUMi)
{
//Si el color original guardado 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.
}