共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									用的是C语言,编译用的是DEV CPP。 
 是模仿国外一个人编写的一个叫做snow的程序,雪花可以在窗体、图像边缘堆积。
 先贴上效果图��
  
 //代码开始:(原谅没有注释,因为我原来是用VB写的,然后直接改写成C语言,要注释到:http://post.baidu.com/f?kz=253376021,参照VB版的注释)
 
 #include windows.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);
 }
 
 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((ColorCmp16)&0xff - (pColor16)&0xff);
 tempG = Abs((ColorCmp8)&0xff - (pColor8)&0xff);
 tempR = Abs((ColorCmp)&0xff - (pColor)&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;iSnowNum;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(timecont200)
 {
 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;jSnowNum;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 WINAPI WinMain(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;
 }
 
 //完毕
 对不,我代码里有一个小错误(也能通过编译):typedef struct POINTAPI,定义struct不是这样定义的。很长时间没用C语言,有些生疏了。另外,实际上这个POINTAPI不用定义,好像在windows.h里已经有了一个POINT的结构体��
 楼主 2016-01-08 10:34 回复 
 
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知