VC窗口抖动源码
时间:2011-05-24 来源:°ι 、曲 终
//窗口抖动实例 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,只想到了间接计算主窗口 //左上角点的办法,显得很冗长。如果有直接的办法,希望不吝赐教…如果说循环用得不好的话 //这倒不是关键
相关阅读 更多 +