桌面下雪小程序
admin
2024-01-20 03:39:41
0

使用win32模式编译.

//#include "stdafx.h"
#include   
#include   
#include  
//#pragma comment(/Entry:WinMain)
#define ID_TIMER    1  
#define SNOWNUM      500  // 雪花数量  
#define CONTRAST    50    // 对比度  
#define YSTART      5    // 用于确定雪花初始时的y坐标  
#define SNOWCR      RGB(0xFF, 0xFF, 0xFF) //雪花的颜色—白色  
#define SNOWGATHERCR RGB(0xDB, 0xDB, 0xFF) //堆积雪花的颜色  typedef struct tagSnow 
{ POINT ptSnowsPos[SNOWNUM]; //用于保存各个雪花的坐标  COLORREF crOrg[SNOWNUM]; //用于画雪花前屏幕原来的颜色  int iVx, iVy, iAllVx, iAllVy; 
}Snow; void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen); 
int GetContrast(HDC hdc, Snow *sn, int iSnow); 
void drawSnow(HDC hdc, Snow *sn, int cxScreen); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 
{ static TCHAR szAppName[] = TEXT ("clsDeskSnow") ; HWND            hwnd ; MSG            msg ; WNDCLASS    wndclass ; wndclass.style        = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc  = WndProc ; wndclass.cbClsExtra    = 0 ; wndclass.cbWndExtra    = 0 ; wndclass.hInstance    = hInstance ; wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName  = NULL ; wndclass.lpszClassName = szAppName ; if(!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0; } hwnd = CreateWindow (szAppName,        TEXT ("桌面下雪"), WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; 
} LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ HDC          hdc ; PAINTSTRUCT  ps ; RECT        rect ; static int cxScreen, cyScreen; //屏幕宽高度(单位:像素)  static int iTimes, iLoopTimes=100; static Snow snowDream; int i; switch (message) { case WM_CREATE: cxScreen = GetSystemMetrics (SM_CXSCREEN) ; cyScreen = GetSystemMetrics (SM_CYSCREEN) ; srand ((int) GetCurrentTime ()) ; //初始化随机数发生器  snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花总体水平飘行速度(-1,0,1)  snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花总体垂直下落速度(1,2)  hdc = GetDC(NULL); //检索整个屏幕的设备上下文环境  for(i=0; i  iLoopTimes) { iTimes = 0; iLoopTimes = 50 + (unsigned)rand()%50; if(snowDream.iAllVx != 0) snowDream.iAllVx = 0; else                  snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花总体水平飘行速度(-1,0,1)  snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花总体垂直下落速度(1,2)  } else iTimes++; drawSnow(hdc, &snowDream, cxScreen); ReleaseDC(NULL, hdc); return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("桌面下雪!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: KillTimer(hwnd, ID_TIMER); // 中止定时器  InvalidateRect(NULL, NULL, TRUE); // 刷新桌面  PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; 
} void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen) //初始化第iSnow个雪花  
{ sn->ptSnowsPos[iSnow].x = (unsigned)rand() % cxScreen; //x范围整个屏幕宽  sn->ptSnowsPos[iSnow].y = (unsigned)rand() % YSTART; //y范围离屏幕顶部YSTART像素点以内  sn->crOrg[iSnow] = GetPixel(hdc, sn->ptSnowsPos[iSnow].x, sn->ptSnowsPos[iSnow].y ) ;//获取给定点的原来的颜色值  
} int GetContrast(HDC hdc, Snow *sn, int iSnow) 
{ int iR, iG, iB; COLORREF crCmp; if(0 == sn->iVx) //若水平速度为0,则取比其大一个像素的正下方的点  crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x, sn->ptSnowsPos[iSnow].y + 1); else //若水平速度>0,取右下方的点。 <0则取左下方的点  crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x + (sn->iVx>0?1:-1), sn->ptSnowsPos[iSnow].y + 1); if(crCmp==SNOWCR) //如果为雪花的颜色  return 0; //分别获取crCmp与对比点的蓝、绿、红部分的差值  iB = abs((crCmp>>16)&0xFF - (sn->crOrg[iSnow]>>16)&0xFF); iG = abs((crCmp>>8)&0xFF  - (sn->crOrg[iSnow]>>8)&0xFF); iR = abs((crCmp)&0xFF    - (sn->crOrg[iSnow])&0xFF); return (iR+iG+iB)/3; 
} void drawSnow(HDC hdc, Snow *sn, int cxScreen) 
{ int i; for(i=0; i crOrg[i] != SNOWCR) SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, sn->crOrg[i]); //还原上一个位置的颜色  sn->iVx = sn->iAllVx*(i%3+1); //雪花的x飘动速度  sn->iVy = sn->iAllVy*(i%3+1); //雪花的y飘动速度  //rand()%5-2使雪花下落的时候 有抖动效果  sn->ptSnowsPos[i].x += sn->iVx+rand()%5-2; //雪花的下一个x坐标  sn->ptSnowsPos[i].y += sn->iVy+1; //雪花的下一个y坐标  //获取给定点的原来的颜色值  sn->crOrg[i] = GetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y); if(CLR_INVALID == sn->crOrg[i]) //如果获取颜色失败,即雪花飘出了屏幕  { initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花  continue; } if(sn->crOrg[i] != SNOWCR) //若当前点的颜色 不等于 雪花的颜色  { if(SNOWGATHERCR == sn->crOrg[i]) //当前点的颜色=堆积的雪的颜色  {  //设置为雪花的颜色  SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR); sn->crOrg[i] = SNOWCR; //initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花  } else if(GetContrast(hdc, sn, i) > 50) //若对比度>50  {  //堆积雪花  SetPixel(hdc, sn->ptSnowsPos[i].x,  sn->ptSnowsPos[i].y,  SNOWGATHERCR); SetPixel(hdc, sn->ptSnowsPos[i].x-1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR); SetPixel(hdc, sn->ptSnowsPos[i].x+1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR); initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花  } else //对比度 <50,不堆积,画出这帧雪花.等下次的时候再还原此点原本的颜色.以产生飘动效果  SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR); } } 
} 

相关内容

热门资讯

原创 4... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
胜宏科技港股大涨49% 做完英... 记者 陈月芹 4月21日,全球AI算力板龙头胜宏科技(02476.HK)登陆港交所,上市首日股价大涨...
永赢基金:聚焦“科技新锐”,科... 数据来源:Wind,时间统计区间为2025/1/1-2026/4/21,指数过往表现不预示未来,不构...
五大阅读趋势显现!当当网发布2... 在第31个世界读书日即将来临之际及首个全民阅读活动周期间,当当网正式发布2026国民阅读洞察报告。 ...
业绩逐季回暖 老百姓大药房一季... 上证报中国证券网讯(记者 夏子航)4月22日晚,老百姓大药房发布2025年年报和2026年一季报。今...
中国20强城市大洗牌:苏州接近... 中国的城市经济竞争格局一直在变化,每年发布的GDP数据都会对城市经济实力进行重新排列。2025年榜又...
直击金宏气体股东会:预期年内氦... 《科创板日报》4月22日讯(记者 郭辉)金宏气体日前举行2025年度股东大会。会上该公司审议了公司年...
5月1日起,俄据悉将叫停哈萨克... 据行业消息人士透露,俄罗斯将于5月1日起停止经友谊管道转运哈萨克斯坦输往德国的石油,相关调整计划已送...
深化具身智能生态布局 京东携手... 4 月 22 日,京东与国内消费级人形机器人头部企业松延动力正式达成三年期战略合作。双方将围绕产品研...
原创 帮... 先问你一个问题,美伊停火今晚到期,按常理避险情绪该升温,黄金应该涨吧?结果恰恰相反——原油涨了,黄金...
300295、600889,将... 三六五网、南京化纤,将被*ST。 公司股票自4月23日开市起停牌一天,于4月24日开市起复牌并实施退...
能源大变天!外媒:羡慕中国的石... 这一次油价突破 110 美元的能源危机,着实魔幻。如果放在十年前,没人会相信中国能在这场风波中获利,...
黄金涨跌两难,现在还能上车吗? 中新网4月22日电(记者 左雨晴) 四月以来,美伊局势反复拉扯,美联储降息预期一变再变。黄金价格在4...
“我身体健康”,库克现身员工大... 当地时间4月21日,受苹果官宣CEO换届影响,公司股价盘中下探超2%,总市值失守4万亿美元关口,收盘...
库克留下一个悬念 工程师能否拯救创新节奏? 听筒Tech(ID:tingtongtech)原创 文 | 赵 森 ...
探索消费信贷与社交支付深度融合... 腾讯这一金融产品再添新功能,4月19日,北京商报记者注意到,微信分付灰度测试转账功能引发热议,在向微...
土耳其主要银行股指早盘下跌2% 每经AI快讯,4月20日,土耳其主要银行股指早盘下跌2%。 每日经济新闻
好用的OTA代运营源头厂家 在如今竞争激烈的酒旅行业中,OTA代运营服务成为了众多酒店、民宿提升竞争力的关键。但市场上的代运营厂...
成都五一出游全国热门第三 “五一”假期临近,同程旅行最新发布的《2026“五一”旅行趋势报告》显示,今年“五一”期间成都同时位...