Ak.xuer 发表于 2011-12-30 21:47:01

看看 谢谢分享

涅槃的龙 发表于 2011-12-30 21:59:51

好东西,看看,

wang0001000 发表于 2012-1-12 10:36:53

就是 别太小气代码发出来分享分享

李星 发表于 2012-1-12 14:57:33

相当唯美楼主真是不得了啊

大眼鱼 发表于 2012-1-14 00:09:36

其实,谷歌首页也能下雪,不需要程序,只需要打let it snow

lsgo 发表于 2012-1-14 01:53:14

如果是单单几个雪花的话那就不好玩了

carp 发表于 2012-1-15 15:55:02

看看漂亮不

bafengao 发表于 2012-1-15 18:23:40

喜欢雪 顶顶:lol:lol

liuphillpotts 发表于 2012-1-15 18:32:18

简约不???

liuphillpotts 发表于 2012-1-15 18:37:58

楼主,源码啊啊,跪求

liuphillpotts 发表于 2012-1-15 18:40:13

代码中的有注译!
#include<windows.h>
#include<time.h>
#include<stdlib.h>

const SnowNumber=500; //雪点数量

struct SnowNode
{
POINT postion; //雪点位置
int   iColor; //先前的颜色
int   iSpeed; //下落速度
int   iMove; //下落距离
int   iStick; //粘贴度
};

SnowNode SnowNodes; //雪点数组
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;//高性能定时器计数
int 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.postion.x=rand()%ScreenWidth;
   SnowNodes.postion.y=rand()%ScreenHeight;
   SnowNodes.iColor=GetPixel(hScreenDC,SnowNodes.postion.x,SnowNodes.postion.y);
   SnowNodes.iSpeed=(rand()%5+1);       //每次下落距离(1-5)
   SnowNodes.iStick=(30-rand()%SnowNodes.iSpeed); //粘贴度(几次循环作一次粘贴连判断

}
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.iSpeed)!=0)
    continue;
   //恢复上次被覆盖点
   if((GetPixel(hScreenDC,SnowNodes.postion.x,SnowNodes.postion.y))==0XFFFFFF)
    SetPixel(hScreenDC,SnowNodes.postion.x,SnowNodes.postion.y,SnowNodes.iColor);
   //根据几向作随机飘落
   x=SnowNodes.postion.x+rand()%3+CrWind;
   y=SnowNodes.postion.y+SnowNodes.iMove;

   //积雪(停留)效果处理
   if( ( (CrStep%SnowNodes.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.postion.x=rand()%ScreenWidth;
    SnowNodes.postion.y=rand()%10;
    SnowNodes.iColor=GetPixel(hScreenDC,SnowNodes.postion.x,SnowNodes.postion.y);
   
   }
   else
   {
    if( (x<0) || (x>ScreenWidth) || (y>ScreenHeight))
    {
   SnowNodes.postion.x=rand()%10;
   SnowNodes.postion.y=rand()%ScreenWidth;
   SnowNodes.iColor=GetPixel(hScreenDC,SnowNodes.postion.x,SnowNodes.postion.y);

    }
    else
    {
   //保存颜色并绘制雪点
   SnowNodes.iColor=GetPixel(hScreenDC,x,y);
   SetPixel(hScreenDC,x,y,0XFFFFFF);
   //此时保存新雪点位置
   SnowNodes.postion.x=x;
   SnowNodes.postion.y=y;
    }
   }
   DeleteDC(hScreenDC);
   CrStep++;
}
}

xhbuming 发表于 2012-1-15 18:54:57

看看哈:lol

583413088 发表于 2012-1-15 20:05:45

真滴吗???我撒撒

xcking 发表于 2012-1-15 20:17:53

还真挺好看的,我看看改成Happy new year的

芊芊 发表于 2012-2-5 17:18:27

:({:1_1:}{:1_1:}{:1_1:}

这里的夜悄悄 发表于 2012-2-5 18:45:46

谢谢楼主分享啊

小军 发表于 2012-2-5 19:13:54

看看 。。啥东西写的也。。

嗜血灵异狂 发表于 2012-2-5 19:52:47

肯定好东西都讲究包装了

isaced 发表于 2012-2-5 20:48:11

看看!!!!!!!!!

1079629687 发表于 2012-2-5 22:35:48

感谢楼主分享
页: 1 [2] 3 4 5 6 7
查看完整版本: Merry Christmas!能够下雪的程序,绝对唯美!!!