|
void __fastcall TMainForm::DrawWireRects(LPRECT lprcFrom, LPRECT lprcTo, UINT nMilliSecSpeed)
{
const int nNumSteps = 50;
nMilliSecSpeed = 10;
GdiFlush();
Sleep(50); // Let the desktop window sort itself out
// if hwnd is null - "you have the CON".
HDC hDC = ::GetDC(NULL);
// Pen size, urmmm not too thick
HPEN hPen = ::CreatePen(PS_SOLID, 2, RGB(0,0,0));
int nMode = ::SetROP2(hDC, R2_NOT);
HPEN hOldPen = (HPEN) ::SelectObject(hDC, hPen);
float angle = 0;
for (int i = 0; i < nNumSteps; i++)
{
double dFraction = (double) i / (double) nNumSteps;
angle+=(360.0/nNumSteps);
float radians=(2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
RECT transition;
transition.left = lprcFrom->left +
(int)((lprcTo->left - lprcFrom->left) * dFraction);
transition.right = lprcFrom->right +
(int)((lprcTo->right - lprcFrom->right) * dFraction);
transition.top = lprcFrom->top +
(int)((lprcTo->top - lprcFrom->top) * dFraction);
transition.bottom = lprcFrom->bottom +
(int)((lprcTo->bottom - lprcFrom->bottom) * dFraction);
TPoint ptRectCtr;
ptRectCtr.x = transition.left+((transition.right-transition.left)/2);
ptRectCtr.y = transition.top+((transition.bottom-transition.top)/2);
RECT rtOrg;
rtOrg.left = -(transition.right-transition.left)/2;
rtOrg.top = -(transition.bottom-transition.top)/2;
rtOrg.right = (transition.right-transition.left)/2;
rtOrg.bottom = (transition.bottom-transition.top)/2;
POINT pt[5];
int x, y;
x=rtOrg.left, y=rtOrg.top;
pt[0] = TPoint(ptRectCtr.x+(x*cosine-y*sine), ptRectCtr.y+(x*sine+y*cosine));
x=rtOrg.right,y=rtOrg.top;
pt[1] = TPoint(ptRectCtr.x+(x*cosine-y*sine), ptRectCtr.y+(x*sine+y*cosine));
x=rtOrg.right,y=rtOrg.bottom;
pt[2] = TPoint(ptRectCtr.x+(x*cosine-y*sine), ptRectCtr.y+(x*sine+y*cosine));
x=rtOrg.left, y=rtOrg.bottom;
pt[3] = TPoint(ptRectCtr.x+(x*cosine-y*sine), ptRectCtr.y+(x*sine+y*cosine));
x=rtOrg.left, y=rtOrg.top;
pt[4] = TPoint(ptRectCtr.x+(x*cosine-y*sine), ptRectCtr.y+(x*sine+y*cosine));
/*
POINT pt[5];
pt[0] = TPoint(transition.left, transition.top);
pt[1] = TPoint(transition.right,transition.top);
pt[2] = TPoint(transition.right,transition.bottom);
pt[3] = TPoint(transition.left, transition.bottom);
pt[4] = TPoint(transition.left, transition.top);
*/
// We use Polyline because we can determine our own pen size
// Draw Sides
::Polyline(hDC,pt,5);
GdiFlush();
Sleep(nMilliSecSpeed);
// UnDraw Sides
::Polyline(hDC,pt,5);
GdiFlush();
}
::SetROP2(hDC, nMode);
::SelectObject(hDC, hOldPen);
::ReleaseDC(NULL,hDC);
}
//---------------------------------------------------------------------------
|