rendered paste bodyvoid 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()<start+time) { cur=GetTickCount()-start; int nx,ny; float koof; if (hide) koof=1-cur/(float)time; else koof=cur/(float)time; nx=size.cx*koof; ny=size.cy*koof; float ssp=sp*cur/time; xf.eM11=cos(ssp)*koof; xf.eM12=-sin(ssp)*koof; xf.eM21=sin(ssp)*koof; xf.eM22=cos(ssp)*koof; xf.eDx=0;xf.eDy=0; bmp.GetBitmapBits(bmpinfo.bmWidthBytes*bmpinfo.bmHeight,bmpbuf); for(int y=0;y<bmpinfo.bmHeight;y++) memset(bmpbuf+y*bmpinfo.bmWidthBytes,0,bmpinfo.bmWidth*4); bmp.SetBitmapBits(bmpinfo.bmWidthBytes*bmpinfo.bmHeight,bmpbuf); bdc.SetWorldTransform(&xf);// bdc.StretchBlt(-nx/2,-ny/2,nx,ny,&dc,0,0,cr.Width(),cr.Height(),SRCCOPY); bdc.BitBlt(-size.cx/2,-size.cy/2,size.cx,size.cy,&dc,0,0,SRCCOPY);// bdc.ModifyWorldTransform(0,MWT_IDENTITY);//// bdc.FillSolidRect(-ssize/2,-ssize/2,100,100,0xFFFF); bmp.GetBitmapBits(bmpinfo.bmWidthBytes*bmpinfo.bmHeight,bmpbuf); DWORD* val; for(int y=0;y<bmpinfo.bmHeight;y++) for(int x=0;x<bmpinfo.bmWidth;x++) { val=(DWORD*)(bmpbuf+y*bmpinfo.bmWidthBytes+x*4); *val|=(0xff<<24)*(*val!=0); } bmp.SetBitmapBits(bmpinfo.bmWidthBytes*bmpinfo.bmHeight,bmpbuf); GetWindow()->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);}