# include & ltwindows.h & gt
# include & ltmath.h & gt
# include & ltstdlib.h & gt
#定義ID_TIMER 1
#定義SNOWNUM 500 //雪花的數量
#定義對比度50 //對比度
#define YSTART 5 //用於確定雪花的初始Y坐標。
#定義雪花Cr RGB (0xff,0xff,0x ff)//雪花的顏色-白色。
# define snowpathercr RGB (0xdb,0xdb,0x ff)//累積雪花的顏色
typedef結構標記
{
POINT ptSnowsPos[SNOWNUM];//用來保存每片雪花的坐標。
COLORREF crOrg[SNOWNUM];//用於繪制雪花前屏幕的原始顏色。
int iVx,iVy,iAllVx,iAllVy
}雪;
void initSnow(HDC hdc,Snow *sn,int iSnow,int CX screen);
int GetContrast(HDC hdc,Snow *sn,int is now);
void drawSnow(HDC hdc,Snow *sn,int CX screen);
LRESULT回調WndProc (HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(h instance h instance,HINSTANCE hPrevInstance,
PSTR深圳國際展覽中心
{
靜態TCHAR szapname[]= TEXT(" clsdesknow ");
HWND hwnd
味精味精;
WNDCLASS wndclass
wnd class . style = CS _ HREDRAW | CS _ VREDRAW;
wndclass.lpfnWndProc = WndProc
wnd class . cbclsextra = 0;
wnd class . cbwndextra = 0;
wnd class . h instance = h instance;
wndclass.hIcon = LoadIcon (NULL,IDI _應用);
wnd class . hcursor = load cursor(NULL,IDC _ ARROW);
wnd class . HBR background =(HBRUSH)GetStockObject(WHITE _ BRUSH);
wndclass.lpszMenuName = NULL
wnd class . lpszclassname = SZ appname;
如果(!register class(& amp;wndclass))
{
MessageBox (NULL,TEXT("該程序需要Windows NT!"),szAppName,MB _ icon error);
返回0;
}
Hwnd = createwindow (szappname,text("桌面上的雪"),
WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT,CW_USEDEFAULT,
240, 120,
NULL,NULL,hInstance,NULL);
ShowWindow (hwnd,icmd show);
更新窗口(hwnd);
while(GetMessage(& amp;msg,NULL,0,0))
{
翻譯消息(& amp味精);
dispatch message(amp;味精);
}
返回msg.wParam
}
LRESULT回調WndProc (HWND hwnd,UINT消息,WPARAM wParam,LPARAM lParam)
{
HDC hdc
PAINTSTRUCT ps
RECT矩形;
靜態int cxScreen,cyScreen//屏幕寬度和高度(單位:像素)
靜態int iTimes,ILO optimes = 100;
靜雪雪堆;
int I;
開關(消息)
{
案例WM_CREATE:
CX screen = GetSystemMetrics(SM _ CX screen);
cy screen = GetSystemMetrics(SM _ cy screen);
srand((int)GetCurrentTime());//初始化隨機數生成器
snow dream . ialvx =(unsigned)rand()% 3-1;//雪花的整體水平飄移速度(-1,0,1)
snow dream . ialvy =(unsigned)rand()% 2+1;//雪花的整體垂直下落速度(1,2)
hdc = GetDC(NULL);//檢索整個屏幕的設備上下文。
for(I = 0;我& ltSNOWNUMi++)
{
snowDream.ptSnowsPos[i]。x = rand()% CX screen;//雪花開始落下的x坐標。
snowDream.ptSnowsPos[i]。y = rand()% y start;//雪花開始落下的Y坐標。
snow dream . crorg[I]= get pixel(hdc,snowDream.ptSnowsPos[i]。x,
snowDream.ptSnowsPos[i]。y);//獲取給定點的原始顏色值。
}
ReleaseDC(NULL,hdc);
SetTimer(hwnd,ID_TIMER,10,NULL);//定時器,10毫秒
返回0;
顯示分辨率改變時的情況WM_DISPLAYCHANGE: //。
CX screen = GetSystemMetrics(SM _ CX screen);
cy screen = GetSystemMetrics(SM _ cy screen);
返回0;
案例WM_TIMER:
hdc = GetDC(NULL);//檢索整個屏幕的設備上下文。
if(iTimes & gt;iLoopTimes)
{
iTimes = 0;
iLoopTimes = 50 +(無符號)rand()% 50;
if(snowDream.iAllVx!= 0)
snow dream . ial lvx = 0;
其他
snow dream . ialvx =(unsigned)rand()% 3-1;//雪花的整體水平飄移速度(-1,0,1)
snow dream . ialvy =(unsigned)rand()% 2+1;//雪花的整體垂直下落速度(1,2)
}
其他
itimes++;
draw snow(hdc & amp;snowDream,CX screen);
ReleaseDC(NULL,hdc);
返回0;
案例WM_PAINT:
hdc = begin paint(hwnd & amp;PS);
GetClientRect(hwnd & amp;rect);
DrawText (hdc,Text("桌面下雪了!"),-1,& amprect,
DT _ single line | DT _ CENTER | DT _ VCENTER);
面漆(hwnd & amp;PS);
返回0;
案例WM_DESTROY:
KillTimer(hwnd,ID _ TIMER);//停止計時器
invalidatory(NULL,NULL,TRUE);//刷新桌面
PostQuitMessage(0);
返回0;
}
返回DefWindowProc (hwnd,message,wParam,lParam);
}
Void init snow (hdchdc,snow * sn,int iSnow,int CX screen)//初始化iSnow雪花。
{
sn-& gt;ptSnowsPos[iSnow]。x =(無符號)rand()% CX screen;//x範圍整個屏幕寬度
sn-& gt;ptSnowsPos[iSnow]。y =(無符號)rand()% y start;//y範圍在屏幕頂部的YSTART像素內。
sn-& gt;crOrg[iSnow] = GetPixel(hdc,sn-& gt;ptSnowsPos[iSnow]。x,
sn-& gt;ptSnowsPos[iSnow]。y);//獲取給定點的原始顏色值。
}
int GetContrast(HDC hdc,Snow *sn,int iSnow)
{
int iR,iG,iB;
COLORREF crCmp
if(0 = = sn-& gt;IVx) //如果水平速度為0,取比它大壹個像素的正下方的點。
crCmp = GetPixel(hdc,sn-& gt;ptSnowsPos[iSnow]。x,sn-& gt;ptSnowsPos[iSnow]。y+1);
Else //如果水平速度>;0,取右下角。& lt0表示左下角。
crCmp = GetPixel(hdc,sn-& gt;ptSnowsPos[iSnow]。x+(sn-& gt;iVx & gt0?1:-1),sn-& gt;ptSnowsPos[iSnow]。y+1);
If(crCmp==SNOWCR) //如果是雪花的顏色,
返回0;
//分別獲取crCmp與比較點藍、綠、紅部分的差值。
iB = ABS((crCmp & gt;& gt16);0x ff-(sn-& gt;crOrg[is now]& gt;& gt16);0x ff);
iG = ABS((crCmp & gt;& gt8)& amp;0x ff-(sn-& gt;crOrg[is now]& gt;& gt8)& amp;0x ff);
iR = abs((crCmp)和amp。0x ff-(sn-& gt;crOrg[is now])& amp;0x ff);
return(iR+iG+iB)/3;
}
void drawSnow(HDC hdc,Snow *sn,int cxScreen)
{
int I;
for(I = 0;我& ltSNOWNUMi++)
{
//如果保存的原始顏色不是雪花的顏色。
if(sn-& gt;克羅格[我]!= SNOWCR)
SetPixel(hdc,sn-& gt;ptSnowsPos[i]。x,sn-& gt;ptSnowsPos[i]。y,
sn-& gt;crOrg[I]);//恢復最後壹個位置的顏色。
sn-& gt;iVx = sn-& gt;ialvx *(I % 3+1);//雪花的x向飄動速度
sn-& gt;iVy = sn-& gt;ialvy *(I % 3+1);//雪花的y向飄動速度
//rand()%5-2使雪花落下時抖動。
sn-& gt;ptSnowsPos[i]。x+= sn-& gt;iVx+rand()% 5-2;//雪花的下壹個x坐標
sn-& gt;ptSnowsPos[i]。y+= sn-& gt;常春藤+1;//雪花的下壹個Y坐標
//獲取給定點的原始顏色值。
sn-& gt;crOrg[i] = GetPixel(hdc,sn-& gt;ptSnowsPos[i]。x,sn-& gt;ptSnowsPos[i]。y);
if(CLR _ INVALID = = sn-& gt;CrOrg[i]) //如果顏色采集失敗,雪花飄出屏幕。
{
initSnow(hdc,sn,I,CX screen);//重新初始化雪花
繼續;
}
if(sn-& gt;克羅格[我]!= SNOWCR) //如果當前點的顏色不等於雪花的顏色。
{
if(snowgatherecr = = sn-& gt;CrOrg[i]) //當前點的顏色=積雪的顏色。
{//設置為雪花的顏色。
SetPixel(hdc,sn-& gt;ptSnowsPos[i]。x,sn-& gt;ptSnowsPos[i]。y,SNOWCR);
sn-& gt;crOrg[I]= snow Cr;
//initSnow(hdc,sn,I,CX screen);//重新初始化雪花
}
else if(GetContrast(hdc,sn,I)>50) //如果對比度>;50
{//堆積雪花
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,CX screen);//重新初始化雪花
}
Else // contrast < 50,畫這壹幀雪花不堆積。等到下壹次恢復這個點的本來顏色產生飄飄欲仙的效果。
SetPixel(hdc,sn-& gt;ptSnowsPos[i]。x,sn-& gt;ptSnowsPos[i]。y,SNOWCR);
}
}
這是我基於互聯網修改的桌面下雪程序。我也可以在vc6.0上搭建壹個新的win32,希望能幫到妳壹點。
}