void CTopCachedWnd::AnimateZoomRotate(BOOL hide, int time, float sp) { FirstInit(); int ssize=(int)sqrt((float)(size.cx*size.cx+size.cy*size.cy)); CBitmap bmp; bmp.CreateBitmap(ssize,ssize,1,32,NULL); CDC bdc; bdc.CreateCompatibleDC(&dc); bdc.SelectObject(&bmp); CRect cr; GetWindow()->GetWindowRect(&cr); DWORD start=GetTickCount(); DWORD cur; CPoint p; CPoint pp(0,0); // bdc.SetStretchBltMode(HALFTONE); bdc.SetGraphicsMode(GM_ADVANCED); XFORM xf; BITMAP bmpinfo; bmp.GetObject(sizeof(BITMAP),&bmpinfo); char* bmpbuf=new char[bmpinfo.bmWidthBytes*bmpinfo.bmHeight]; Animating=TRUE; bdc.SetViewportOrg(ssize/2,ssize/2); if (!hide) GetWindow()->ShowWindow(SW_SHOW); DrawOnly(); p.x=(cr.left+cr.right)/2-ssize/2; p.y=(cr.top+cr.bottom)/2-ssize/2; CSize sz(ssize,ssize); GetWindow()->SetWindowPos(NULL,p.x,p.y,ssize,ssize,SWP_NOZORDER|SWP_NOCOPYBITS|SWP_NOREDRAW|SWP_HIDEWINDOW); BLENDFUNCTION bf; bf.SourceConstantAlpha=255; bf.AlphaFormat=AC_SRC_ALPHA; bf.BlendFlags=0; bf.BlendOp=AC_SRC_OVER; while(GetTickCount()UpdateLayeredWindow(NULL,&p,&sz,&bdc,&pp,0,&bf,ULW_ALPHA); GetWindow()->ShowWindow(SW_SHOW); } delete[] bmpbuf; p.x=cr.left; p.y=cr.top; Animating=FALSE; if (hide) GetWindow()->ShowWindow(SW_HIDE); GetWindow()->SetWindowPos(NULL,p.x,p.y,size.cx,size.cy,SWP_NOZORDER|SWP_NOCOPYBITS|SWP_NOSENDCHANGING ); GetWindow()->UpdateLayeredWindow(NULL,&p,&size,&dc,&pp,0,0,ULW_OPAQUE); }