《Windows程序设计》之SCRAMBLE

///////////////////////////////////////////////////////////////////////
//这应该是写的第一个没有窗口过程的程序
///////////////////////////////////////////////////////////////////////

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;
}


你可能感兴趣的:(windows,cache,null,winapi)