求一个震动对话框的函数,就像MSN/QQ那种。
this窗口...
自写了一个用MoveWindow的,四个角只是收缩了一下,像伸懒腰,就没了。。囧

解决方案 »

  1.   

    MoveWindow就可以
    显然要注意延时以及Move的坐标,只是震动的话,窗口宽高是不变的
      

  2.   

    MoveWindow的宽和高不要改变,例如原左上点坐标为X,Y,使用不阻塞消息的定时器(不要SLEEP)将循环MoveWindow至(X+10,Y+10)、(X-10,Y+10)、(X+10,Y-10)、(X-10,Y-10),移动的大小也可以按照窗口原大小以一定比例换算。
      

  3.   


    // 窗口振动函数
    void CXXX::ShakeWindow()
    {
    CRect rcWnd ;
    GetWindowRect(rcWnd) ;
    m_ptPosBeforeShake = rcWnd.TopLeft() ;    // 记录窗口振动之前的位置
    SetTimer(1, 40, NULL) ;                   // 启动窗口振动定时器
    }#define OFFSET 3
    void CXXX::OnTimer(UINT nIDEvent) 
    {
    static int s_nIndex = 0 ;
    static int s_anOffset[][2] = {
    {OFFSET, - OFFSET}, {0, - OFFSET - OFFSET}, {- OFFSET, - OFFSET}, {0, 0},
    {OFFSET, - OFFSET}, {0, - OFFSET - OFFSET}, {- OFFSET, - OFFSET}, {0, 0},
    {OFFSET, - OFFSET}, {0, - OFFSET - OFFSET}, {- OFFSET, - OFFSET}, {0, 0},
    {OFFSET, - OFFSET}, {0, - OFFSET - OFFSET}, {- OFFSET, - OFFSET}, {0, 0},
    } ;    // 振动轨迹为4次菱形循环
    if (nIDEvent == 1)
    {
    SetWindowPos(
    NULL,
    m_ptPosBeforeShake.x + s_anOffset[s_nIndex][0], m_ptPosBeforeShake.y + s_anOffset[s_nIndex][1],
    0, 0,
    SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE
    ) ;
    ++ s_nIndex ;
    if (s_nIndex == 16)
    {
    s_nIndex = 0 ;
    KillTimer(1) ;
    }
    }
    CWnd::OnTimer(nIDEvent);
    }
      

  4.   

    定时的变化 窗体的坐标, 就是MoveWindow或者或者SetWindowPos的应用