Ejecución del código fuente del mini programa
# 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) // Color del copo de nieve: 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(amp;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 rectángulo;
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; p>
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 de deriva horizontal general 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]. 1, sn->ptSnowsPos[i].y+1,snowgatherecr);
initSnow(hdc, sn, I, CX screen); //Reinicializar copo 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.
}