#include〈windows.h〉

#include〈time.h〉

#include〈stdlib.h〉

#include〈iostream.h〉

const int SnowNumber=500; //雪点数量

struct SnowNode

{

POINT postion; //雪点位置

int iColor; //先前的颜色

int iSpeed; //下落速度

int iMove; //下落距离

int iStick; //粘贴度

};

SnowNode SnowNodes[SnowNumber]; //雪点数组

int hTimer=0;

int CrWind=0;

int CrStep=0; //当前循环步数(用于限速)

int ScreenWidth=0; //屏幕宽度

int ScreenHeight=0; //屏幕高度

void GetScreenSize();

void CALLBACK TimerProc(HANDLE hWnd,UINT uMsg,UINT idEvent,DWORD dwTime);

void InitSnowNodes();

void MoveSnowNodes();

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow

)

{

MSG msg; //标准windows消息

LARGE_INTEGER Frequency; //高性能定时器频率

LARGE_INTEGER StartCt,EndCt;//高性能定时器计数

float ElapsedTime; //时间间隔

srand((unsigned)time(NULL));

GetScreenSize();

InitSnowNodes();

QueryPerformanceFrequency(&Frequency);

hTimer=SetTimer(0,0,rand()%5*500,(TIMERPROC)TimerProc);

if(hTimer==0)

{

MessageBox(0,TEXT(“创建定时器失败“),TEXT(“提示“),MB_OK|MB_ICONINFORMATION);

return -1;

}

RegisterHotKey(0,0,MOD_CONTROL,(int)’L’);

while(1)

{

QueryPerformanceCounter(&StartCt); //执行运算前计数值

if(PeekMessage(&msg,0,0,0,1))

{

switch(msg.message)

{

case WM_TIMER: TimerProc(0,0,0,0);

break; //预设风向改变时间已到

case WM_HOTKEY: KillTimer(0,hTimer);//删除随机风向定时 器

UnregisterHotKey(0,0);//删除退出热键

InvalidateRect(0,NULL,true);

exit(1);

break;

case WM_DISPLAYCHANGE:

GetScreenSize(); //重新取屏幕的尺寸

InitSnowNodes(); //初始化雪点的数组

break;

}

}

MoveSnowNodes();

QueryPerformanceCounter(&EndCt);//执行运算后的计数值

ElapsedTime=(EndCt.QuadPart-StartCt.QuadPart)/Frequency.QuadPart;

if((ElapsedTime〈0.0005))

Sleep(2); //简单限速

else if(ElapsedTime〈0.0010)

Sleep(1);

else if(ElapsedTime〈0.0015)

Sleep(3);

}

//MessageBox(0,TEXT(“消息“),TEXT(“消息“),MB_OK|MB_ICONINFORMATION);

return 0;

}

void GetScreenSize()

{

ScreenWidth=GetSystemMetrics(SM_CXSCREEN);

ScreenHeight=GetSystemMetrics(SM_CYSCREEN);

return ;

}

void CALLBACK TimerProc(HANDLE hWnd,UINT uMsg,UINT idEvent,DWORD dwTime)

{

// MessageBox(0,TEXT(“消息“),TEXT(“消息“),MB_OK|MB_ICONINFORMATION);

srand((unsigned)time(NULL));

if(hTimer==0)

{

MessageBox(0,TEXT(“创建定时器失败“),TEXT(“提示“),MB_OK|MB_ICONINFORMATION);

return ;

}

SetTimer(0,hTimer,((rand()%27+4)*500),(TIMERPROC)TimerProc); 重设下次风向改变时间

//修改风向

if(CrWind!=0)

CrWind=0;

else

CrWind=rand()%3-1;

return ;

}

void InitSnowNodes()

{

HDC hScreenDC=0;

int j=0;

hScreenDC=CreateDC(“DISPLAY“,NULL,NULL,NULL);

if(hScreenDC==NULL)

{

MessageBox(0,“获取屏幕DC失败!“,“信息“,MB_OK|MB_ICONERROR);

return ;

}

srand((unsigned)time(NULL));

for(j=0;j〈SnowNumber;j++)

{

SnowNodes[j].postion.x=rand()%ScreenWidth;

SnowNodes[j].postion.y=rand()%ScreenHeight;

SnowNodes[j].iColor=GetPixel(hScreenDC,SnowNodes[j].postion.x,SnowNodes[j].postion.y);

SnowNodes[j].iSpeed=(rand()%5+1); //每次下落距离(1-5)

SnowNodes[j].iStick=(30-rand()%SnowNodes[j].iSpeed); //粘贴度(几次循环作一次粘贴连判断

// cout〈〈SnowNodes[j].postion.x〈〈“ Y:“〈〈SnowNodes[j].postion.y〈〈endl;

}

DeleteDC(hScreenDC);

}

void MoveSnowNodes()

{

// MessageBox(0,TEXT(“消息“),TEXT(“消息“),MB_OK|MB_ICONINFORMATION);

HDC hScreenDC=0;

srand((unsigned)time(NULL));

int x=0,y=0,i=0;

hScreenDC=CreateDC(“DISPLAY“,NULL,NULL,NULL);

if(hScreenDC==NULL)

{

MessageBox(0,“获取屏幕DC失败!“,“信息“,MB_OK|MB_ICONERROR);

return ;

}

// TextOut(hScreenDC,0,0,“虽然大检查顺顺藤摸瓜克格勃呀加“,0);

for(i=0;i〈SnowNumber;i++)

{

//控制雪点下降速度

if((CrStep%SnowNodes[i].iSpeed)!=0)

continue;

//恢复上次被覆盖点

if((GetPixel(hScreenDC,SnowNodes[i].postion.x,SnowNodes[i].postion.y))==0XFFFFFF)

SetPixel(hScreenDC,SnowNodes[i].postion.x,SnowNodes[i].postion.y,SnowNodes[i].iColor);

//根据几向作随机飘落

x=SnowNodes[i].postion.x+rand()%3+CrWind;

y=SnowNodes[i].postion.y+SnowNodes[i].iMove;

//积雪(停留)效果处理

if( ( (CrStep%SnowNodes[i].iStick)==0)

&&( (GetPixel(hScreenDC,x,y))!=(GetPixel(hScreenDC,x,y+1)))

&&( (GetPixel(hScreenDC,x-1,y))!=(GetPixel(hScreenDC,x-1,y+1)))

&&( (GetPixel(hScreenDC,x+1,y))!=GetPixel(hScreenDC,x+1,y+1))

)

{

//稍稍调整坐标

if(GetPixel(hScreenDC,x,y-1)==GetPixel(hScreenDC,x,y-2))

{

y--;

}

else

{

if(GetPixel(hScreenDC,x,y-1)==GetPixel(hScreenDC,x,y-2))

y++;

x+=CrWind;

}

//画三个雪花点

SetPixel(hScreenDC,x,y,0XFFFFFF);

SetPixel(hScreenDC,x+1,y+1,0XFFFFFF);

SetPixel(hScreenDC,x-1,y+1,0XFFFFFF);

//重生雪点

SnowNodes[i].postion.x=rand()%ScreenWidth;

SnowNodes[i].postion.y=rand()%10;

SnowNodes[i].iColor=GetPixel(hScreenDC,SnowNodes[i].postion.x,SnowNodes[i].postion.y);

}

else

{

if( (x〈0) || (x〉ScreenWidth) || (y〉ScreenHeight))

{

SnowNodes[i].postion.x=(rand()%10);

SnowNodes[i].postion.y=(rand()%ScreenWidth);

SnowNodes[i].iColor=GetPixel(hScreenDC,SnowNodes[i].postion.x,SnowNodes[i].postion.y);

}

else

{

//保存颜色并绘制雪点

SnowNodes[i].iColor=GetPixel(hScreenDC,x,y);

SetPixel(hScreenDC,x,y,0XFFFFFF);

//此时保存新雪点位置

SnowNodes[i].postion.x=x;

SnowNodes[i].postion.y=y;

}

}

}

DeleteDC(hScreenDC);

CrStep++;

}

用C++写的在桌面上飘雪的特效程序.doc

下载Word文档到电脑,方便收藏和打印[全文共3466字]

编辑推荐:

下载Word文档

c语言 桌面下雪程序,用C++写的在桌面上飘雪的特效程序相关推荐

  1. 怎么抓python程序的包_如何在AWS上部署python应用程序

    如何在AWS上部署python应用程序,学姐呕心沥血亲自总结,亲测有效,比网上看网上大把大把的文档要快得多! 作者:蕾学姐 亚马逊云计算服务(Amazon Web Services,缩写为AWS),由 ...

  2. 笔记本怎样运行android程序,PC手机二合一 在笔记本上如何运行安卓程序

    由于系统逻辑的不同,作为当前人类社会中最重要的战略性物资,手机和笔记本电脑并没有实现互通有无,而厂商们为了展现自家生态的独特优势,一直都在极力去思考如何打通PC系统和手机系统的壁垒,比如去年我们一直都 ...

  3. python开发桌面时钟_python基于Kivy写一个图形桌面时钟程序

    Kivy 是一个开源的 Python 第三方库,可以用来快速开发应用程序. 它有如下三个特点: 跨平台 Kivy 编写的程序可在 Linux,Windows,OS X,Android,iOS 和 Ra ...

  4. java高级程序员如何写好简历,一份优秀的程序员简历是什么样的?

    2019独角兽企业重金招聘Python工程师标准>>> 马上就要到一年一度,最适合找工作的时间段:金三银四.另外一个时间段是:金九银十.金三银四的大意是:最好的时间是三月,其次是四月 ...

  5. 在windows平台上编写的python程序无法在_在 Windows 平台上编写的 Python 程序无法在 Unix 平台运行。_护理学基础(精品资源课)答案_学小易找答案...

    [单选题]对于IEEE754单精度浮点数加减运算,只要对阶时得到的两个阶码之差的绝对值|△E|大于等于( ),就无需继续进行后续处理,此时,运算结果直接取阶大的那个数. (6.0分) [判断题]婚礼虽 ...

  6. mac应用程序在哪_如何在Mac上列出所有应用程序

    mac应用程序在哪 MacOS applications are installed a bit differently than Windows. Since they're almost alwa ...

  7. window应用在linux运行,如何在Linux上运行Windows应用程序?

    原标题:如何在Linux上运行Windows应用程序? 一些人可能避免在Linux上运行Windows应用程序,但事实上有时候这么做大有帮助. 一些人无法摆脱Windows的最主要原因之一是可用的应用 ...

  8. 64位Ubuntu上编译32位程序

    1.确认主机为64位架构的内核,应该输出为adm64,执行: $ dpkg --print-architecture 2.确认打开了多支架功能,应该输出为i386,执行: $ dpkg --print ...

  9. 在Windows上创建CUDA C程序

    文章目录 一.安装Visual Studio 二.安装CUDA工具包 (一)查看GPU型号 (二)下载CUDA10.0 (三)安装CUDA10.0 三.初探CUDA C程序 (一)CUDA C程序概述 ...

  10. Mac使用技巧:在 iPhone 或 iPad 上自动更新应用程序

    如何在 iPhone 或 iPad 上自动安装应用程序更新?按照本提示中的步骤操作,以便您可以自动下载和安装应用程序更新. 在 iOS 中自动更新应用程序 您可以在iPhone和iPad上自动安装应用 ...

最新文章

  1. ubuntu 14.04 安装java_Ubuntu 14.04中安装Java
  2. IE浏览器导出问题。。好要命
  3. jQuery对象和DOM对象
  4. JSP自定义标签学习笔记
  5. Linux内核驱动GPIO的使用
  6. 【POJ - 2728】Desert King (最有比率生成树,分数规划)
  7. 元宵节快乐 | 2月15日 星期二 | 携程在国内率先开启混合办公模式;米哈游推出元宇宙品牌;AMD宣布完成对赛灵思的收购...
  8. (5)css样式表特征
  9. 图解Python多修饰器时哪个先起作用
  10. P1551 亲戚题解
  11. 调试信息清除小工具的编写
  12. 服务器更换主板后系统无法启动
  13. 06.Python网络爬虫之requests模块(2)
  14. java 内部类 加载_Java 内部类基础介绍
  15. N天学习一个Linux命令之grep
  16. python里面的pip是什么意思_python中pip是什么
  17. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)...
  18. Longhorn配置参数详解
  19. Windows 虚拟机Keypair获取登陆密码
  20. 南山谷主:面包屑导航是什么意思?对SEO有何作用?

热门文章

  1. SparkSQL案例-图书信息分析
  2. mmap库:Python内存映射文件操作
  3. Java排序算法代码集(7个)
  4. 剪切音频matlab_怎样用matlab分割音频文件(wav)或其他
  5. 孔浩老师SpringMVC视频总结
  6. 1分钟获取上千ID,暴力破解、端口扫描、拖库攻击如何防范
  7. 大众点评字体_【网络爬虫实战】解决大众点评搜索页面字体加密
  8. 入门必学 | R语言常见的报错指南
  9. 字节跳动斥巨资开发出《Python知识手册》
  10. 西门子S7-1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机