///
//这应该是写的第一个没有窗口过程的程序
///
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程序设计》之SCRAMBLE
最新推荐文章于 2024-09-13 22:14:19 发布