#include
#include
#include
#include
const int ScrnWidth=1024;
const int ScrnHight=768;
const long SnowCol =0xFEFFFE;
const long SnowColDown =0xFFFFFF;
const long SnowColDuck =0xFFDDDD;
const int SnowNum = 500;
const int ID_TIMER = 10;
const char g_szClassName[] = "myWindowClass";
typedef struct POINTAPI
{
long x;
long y;
}a;
int N[4][7]=
{ 131,147,165,175,196,220,247, //低度音调
262,286,330,349,440,440,494, //中度音调
523,158,659,698,784,880,998, //高度音调
1047,1175,1319,1397,1568,1760,1976 //高八度音调
};
static HDC hDC1;
static struct POINTAPI pData[500];
static long pColor[500];
static int Vx,Vy,PVx,PVy,timecont;
long Abs(long num)
{
if(num>=0)return(num);
else return(-num);
}
int Random(int max)
{
return(rand()%max);
}
void InitP(int i)
{
pData[i].x=Random(ScrnWidth);
pData[i].y = Random(5);
pColor[i] = GetPixel(hDC1, pData[i].x, pData[i].y);
}
long GetContrast(int i)
{
long ColorCmp;
long tempR;
long tempG;
long tempB;
int Slope;
if(PVy!=0) Slope = PVx / PVy;
else Slope = 2;
if(Slope==0) ColorCmp = GetPixel(hDC1, pData[i].x, pData[i].y + 1);
else if(Slope > 1) ColorCmp = GetPixel(hDC1, pData[i].x + 1, pData[i].y + 1);
else ColorCmp = GetPixel(hDC1, pData[i].x - 1, pData[i].y + 1);
if(ColorCmp==SnowCol)return 0;
tempB = Abs((ColorCmp>>16)&0xff - (pColor[i]>>16)&0xff);
tempG = Abs((ColorCmp>>8)&0xff - (pColor[i]>>8)&0xff);
tempR = Abs((ColorCmp)&0xff - (pColor[i])&0xff);
//return(tempR * 0.114 + tempG * 0.587 + tempB * 0.299);
return((tempR + tempG + tempB) / 3);
}
void DrawP(void)
{
int i;
// srand(time(0));
for(i=0;i
{
if(pColor[i]!=SnowCol&&pColor[i]!=-1)SetPixel(hDC1, pData[i].x, pData[i].y, pColor[i]);
PVx = Random(2) - 1 + Vx * (i % 3);
PVy = Vy * (i % 3 + 1);
pData[i].x = pData[i].x + PVx;
pData[i].y = pData[i].y + PVy;
pColor[i] = GetPixel(hDC1, pData[i].x, pData[i].y);
if(pColor[i] ==-1)InitP(i);
else
if(pColor[i]!=SnowCol)
if (Random(16) > 5 || GetContrast(i) < 50)SetPixel(hDC1, pData[i].x, pData[i].y, SnowCol);
else
{
SetPixel(hDC1, pData[i].x, pData[i].y - 1, SnowColDuck);
SetPixel(hDC1, pData[i].x - 1, pData[i].y, SnowColDuck);
SetPixel(hDC1, pData[i].x + 1, pData[i].y, SnowColDown);
InitP(i);
}
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_TIMER: //时钟
{
if(timecont>200)
{
timecont=0;
Vx = Random(4) - 2;
Vy = Random(2) + 2;
}
else timecont+=1;
DrawP();
}
break;
case WM_CREATE:
{
int j;
srand(time(0));
Vx = Random(4) - 2;
Vy = Random(2) + 2;
for(j = 0;j
{
pData[j].x = Random(ScrnWidth);
pData[j].y = Random(ScrnHight);
pColor[j] = GetPixel(hDC1, pData[j].x, pData[j].y);
}
SetTimer(hwnd, ID_TIMER, 10, NULL);
hDC1 = GetDC(0);
timecont=0;
}
break;
case WM_CLOSE:
ReleaseDC(0, hDC1);
DestroyWindow(hwnd);
break;
case WM_DESTROY:
KillTimer(hwnd, ID_TIMER);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
#pragma comment ( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "窗体注册失败!", "错误!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, "屏幕飘雪", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "窗体创建失败!", "错误!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
int count=0;
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
你看看,我调试通过了的!