/////////////////////////////////////////////////////////////////////// //这应该是写的第一个没有窗口过程的程序 /////////////////////////////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { static int iKeep[NUM][4]; HDC hdcScr,hdcMem; int cx,cy; HBITMAP hBitmap; HWND hwnd; int i,j,x1,y1,x2,y2; //锁定桌面窗口,禁止更新 if(LockWindowUpdate(hwnd=GetDesktopWindow())) { //获取整个屏幕的设备环境,DCX_CACHE从高速缓存中获取,DCX_LOCKWINDOWUPDATE用于在跟踪期间进行绘制 hdcScr=GetDCEx(hwnd,NULL,DCX_CACHE|DCX_LOCKWINDOWUPDATE); //创建内存设备环境上下文 hdcMem=CreateCompatibleDC(hdcScr); //把屏幕分成10份 cx=GetSystemMetrics(SM_CXSCREEN)/10; cy=GetSystemMetrics(SM_CYSCREEN)/10; //创建与hdcScr相兼容的位图 hBitmap=CreateCompatibleBitmap(hdcScr,cx,cy); //选入内存环境上下文 SelectObject(hdcMem,hBitmap); //用当前系统时间做为种子生成随机数 srand((int)GetCurrentTime()); for(i=0;i<2;i++) for(j=0;j<NUM;j++) { //当i==0时,用iKeep[NUM][4]来保存变化过程 if(i==0) { iKeep[j][0]=x1=cx*(rand()%10); iKeep[j][1]=y1=cy*(rand()%10); iKeep[j][2]=x2=cx*(rand()%10); iKeep[j][3]=y2=cy*(rand()%10); } //当i!=0时,用iKeep[NUM][4]来恢复桌面 else { x1=iKeep[NUM-1-j][0]; y1=iKeep[NUM-1-j][1]; x2=iKeep[NUM-1-j][2]; y2=iKeep[NUM-1-j][3]; } //使用BitBlt进行方块变换 BitBlt(hdcMem,0,0,cx,cy,hdcScr,x1,y1,SRCCOPY); BitBlt(hdcMem,x1,y1,cx,cy,hdcScr,x2,y2,SRCCOPY); BitBlt(hdcScr,x2,y2,cx,cy,hdcMem,0,0,SRCCOPY); Sleep(10); } DeleteDC(hdcMem); ReleaseDC(hwnd,hdcScr); DeleteObject(hBitmap); //取消锁定 LockWindowUpdate(NULL); } return FALSE; }