搜索
查看: 4255|回复: 10
打印 上一主题 下一主题

桌面下雪小程序

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-15 11:38:47 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 2420015589 于 2013-1-15 11:42 编辑

#include <windows.h>
#include<time.h>
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 = 1;
const char g_szClassName[] = "myWindowClass";
typedef struct POINTAPI
{
long x;
long y;
}a;
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);
}
int InitP(int i)
{
pData.x=Random(ScrnWidth);
pData.y = Random(5);
pColor = GetPixel(hDC1, pData.x, pData.y);
return 0;
}
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.x, pData.y + 1);
else if(Slope > 1) ColorCmp = GetPixel(hDC1, pData.x + 1, pData.y + 1);
else ColorCmp = GetPixel(hDC1, pData.x - 1, pData.y + 1);
if(ColorCmp==SnowCol)return 0;
tempB = Abs((ColorCmp>>16)&0xff - (pColor>>16)&0xff);
tempG = Abs((ColorCmp>>8)&0xff - (pColor>>8)&0xff);
tempR = Abs((ColorCmp)&0xff - (pColor)&0xff);
return((tempR + tempG + tempB) / 3);
}
void DrawP(void)
{
int i;
for(i=0;i<SnowNum;i++)
{
if(pColor!=SnowCol&&pColor!=-1)SetPixel(hDC1, pData.x, pData.y, pColor);
PVx = Random(2) - 1 + Vx * (i % 3);
PVy = Vy * (i % 3 + 1);
pData.x = pData.x + PVx;
pData.y = pData.y + PVy;
pColor = GetPixel(hDC1, pData.x, pData.y);
if(pColor ==-1)InitP(i);
else
if(pColor!=SnowCol)
if (Random(16) > 5 || GetContrast(i) < 50)SetPixel(hDC1, pData.x, pData.y, SnowCol);
else
{
SetPixel(hDC1, pData.x, pData.y - 1, SnowColDuck);
SetPixel(hDC1, pData.x - 1, pData.y, SnowColDuck);
SetPixel(hDC1, pData.x + 1, pData.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<SnowNum;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;
}
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);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}


1.png (174.31 KB, 下载次数: 9)

1.png

桌面积雪小程序.zip

36.11 KB, 下载次数: 140

点此下载...

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表