VC窗口抖动源码

//窗口抖动实例
CPoint CurrentPos; //抖完还要回到这个位置,不要乱跑。
CRect rect; //这一段计算主要是为了满足SetWindowPos()的参数要求…不解释吧
GetClientRect(&rect);
ClientToScreen(&rect);
CurrentPos.x = rect.left;
CurrentPos.y = rect.top;
int FrameWidth;
int FrameHight;
int CaptionHight; //我当前系统设置上这三个值分别为3,3,22
FrameWidth = GetSystemMetrics(SM_CXFIXEDFRAME);
FrameHight = GetSystemMetrics(SM_CYFIXEDFRAME);
CaptionHight = GetSystemMetrics(SM_CYCAPTION); //这是个好函数
//这里需要将CurrentPos坐标offset()到主窗口左上角坐标
CurrentPos.Offset(-FrameWidth, -CaptionHight-FrameHight);
//实现抖动: 半个小圈 + 三个大圈 + 半个小圈
SetWindowPos(&wndTopMost,CurrentPos.x-1,CurrentPos.y-2,0,0, SWP_NOSIZE);
Sleep(10);//上面的SWP_NOSIZE参数忽略cx,cy,故可置0
SetWindowPos(&wndTopMost,CurrentPos.x-4,CurrentPos.y-4,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-7,CurrentPos.y-2,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-8,CurrentPos.y,0,0, SWP_NOSIZE);
Sleep(10);
int i = 0;
for (;i<3;i++) //想抖几圈就改几
{
SetWindowPos(&wndTopMost,CurrentPos.x-6,CurrentPos.y+6,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x,CurrentPos.y+8,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x+6,CurrentPos.y+6,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x+8,CurrentPos.y,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x+6,CurrentPos.y-6,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x,CurrentPos.y-8,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-6,CurrentPos.y-6,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-8,CurrentPos.y,0,0, SWP_NOSIZE);
Sleep(10);
}
SetWindowPos(&wndTopMost,CurrentPos.x-7,CurrentPos.y+2,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-4,CurrentPos.y+4,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x-1,CurrentPos.y+2,0,0, SWP_NOSIZE);
Sleep(10);
SetWindowPos(&wndTopMost,CurrentPos.x,CurrentPos.y,0,0, SWP_NOSIZE);
//Sleep()的时延和抖动圆弧的半径什么的,自己看着写就是了。我这里的设置动起来还是很cute的
//另外,还有一个比较有用的拓展,这段代码一般是放在dlg类中实现的,SetWindowPos()、
//等等函数可直接用。如果要从别的类或者全局函数中调用,则需要事先获取被抖动对象的指针。
//可以在最前面加上这几句:
// CXXXXApp* pApp = (CXXXXApp*)AfxGetApp();
// CXXXXDlg *pShakeDlg = (CXXXXDlg *)pApp->GetMainWnd();
// //然后所有调用dlg类的成员时,都要通过该指针,如:
// pShakeDlg->ClientToScreen(&rect);
// pShakeDlg->SetWindowPos(&wndTopMost,CurrentPos.x-4,CurrentPos.y-4,0,0, SWP_NOSIZE);
//全局函数以及API就不必了。
//理论上这样就可以从任何可能的位置“遥控”的抖动了,比如自己曾做了一个从静态成员函数
//访问目标对话框对象的例子,都是不难实现的。
//这几行破烂文字和笨方法代码高手就别笑了,写的时候只查了MSDN,只想到了间接计算主窗口
//左上角点的办法,显得很冗长。如果有直接的办法,希望不吝赐教…如果说循环用得不好的话
//这倒不是关键

转载于:https://www.cnblogs.com/rogee/archive/2011/05/24/2055918.html

你可能感兴趣的:(VC窗口抖动源码)