當前位置:編程學習大全網 - 源碼下載 - applet的底層源代碼

applet的底層源代碼

# include & ltiostream.h & gt

# 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,希望能幫到妳壹點。

}

  • 上一篇:商用 日常祝福短信
  • 下一篇:ADSL錯誤代碼的信息翻譯
  • copyright 2024編程學習大全網