(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "maple"; wcex.hIconSm = NULL; return RegisterClassEx(&wcex); } //****初始化函数************************************* // 1.加载位图资源 // 2.取得内部窗口区域信息 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HBITMAP bmp; hInst = hInstance; hWnd = CreateWindow("maple", "浅墨的绘图窗口" , WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MoveWindow(hWnd,10,10,600,450,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480); SelectObject(mdc,bmp); bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); star = (HBITMAP)LoadImage(NULL,"star.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); mask = (HBITMAP)LoadImage(NULL,"mask.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hWnd,&rect); SetTimer(hWnd,1,0,NULL); MyPaint(hdc); return TRUE; } //****自定义绘图函数********************************* // 1.窗口贴图 // 2.实现星光绽放的效果 void MyPaint(HDC hdc) { //创建粒子 if(count == 0) //随机设置爆炸点 { int x=rand()%rect.right; int y=rand()%rect.bottom; for(i=0;i<50;i++) //产生星光粒子 { flystar[i].x = x; flystar[i].y = y; flystar[i].lasted = 0; //设定该粒子存在的时间为零 if(i%2==0) //按粒子编号i来决定粒子在哪个象限运动,且x,y方向的移动速度随机为1—15之间的一个值,由1+rand()%15来完成。 { flystar[i].vx = -(1+rand()%15); flystar[i].vy = -(1+rand()%15); } if(i%2==1) { flystar[i].vx = 1+rand()%15; flystar[i].vy = 1+rand()%15; } if(i%4==2) { flystar[i].vx = -(1+rand()%15); flystar[i].vy = 1+rand()%15; } if(i%4==3) { flystar[i].vx = 1+rand()%15; flystar[i].vy = -(1+rand()%15); } flystar[i].exist = true; //设定粒子存在 } count = 50; //50个粒子由for循环设置完成后,我们将粒子数量设为50,代表目前有50颗星光 } //先在内存dc中贴上背景图片 SelectObject(bufdc,bg); BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY); for(i=0;i<50;i++) { if(flystar[i].exist) //判断粒子是否还存在,若存在,则根据其坐标(flystar[i].x,flystar[i].y)进行贴图操作 { SelectObject(bufdc,mask); BitBlt(mdc,flystar[i].x,flystar[i].y,30,30,bufdc,0,0,SRCAND); SelectObject(bufdc,star); BitBlt(mdc,flystar[i].x,flystar[i].y,30,30,bufdc,0,0,SRCPAIN |