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,只想到了间接计算主窗口

//左上角点的办法,显得很冗长。如果有直接的办法,希望不吝赐教…如果说循环用得不好的话

//这倒不是关键

你可能感兴趣的:(源码)