现在想做出一个对话框上有5个按钮。如果我按左右键,会出现按钮一个移动的过程。。
如果用movewindow感觉不到移动的那种效果,就像IPHONE和安卓一样的滑动的效果。
现在没一点思路,高手指教。谢谢。

解决方案 »

  1.   

    movewindow是直接设置到某个位置
    如果要看到滑动效果的话就要把它在滑动过程中的位置也显示出来,就是好多次movewindow一步一步移动到想去的位置,速度快了看着就是滑过去的了
      

  2.   

    一次10个像素能像ios那样平滑吗,LS真搞笑
    我做过滑动菜单,就像迅雷7右键菜单那样的,不过迅雷7现在改没了,迅雷看看4还有这个特效。
    我的经验一次移动5个像素以内就可以,timer设到最小才可以,大概20ms把。关键是自己设计一下匀加速、匀减速运动,物理没学好的补一下。
      

  3.   

    貌似不用了,VS2010 SP1貌似带了切换动画
      

  4.   


    这个是每次一个FOR循环,5个像素点。然后用定时器是吗?
      

  5.   

    肯定是用MoveWindow做了
    你看看这个例子能不能给你些启示
    http://download.csdn.net/detail/xianglitian/210083
      

  6.   

    for()
    {
      sleep(200);
      movewindow();
    }
      

  7.   

      if (0 == nIDEvent)
          {
                rc1.left += 8;
                rc2.left += 8;
                rc3.left += 8;
                rc1.right += 8;
                rc2.right +=8;
                rc3.right += 8;
                m_bt1.MoveWindow(rc1);
                m_bt2.MoveWindow(rc2);
                m_bt3.MoveWindow(rc3);
    //          m_bt1.Invalidate();
    //          m_bt2.Invalidate();
    //          m_bt3.Invalidate();
                RedrawWindow();            m_iCount++;
                if(m_iCount>20)
                {
                      KillTimer(0);
                }
          }
          CDialog::OnTimer(nIDEvent);我现在是这么做的。感觉出来点效果了。问题是会有点闪烁。
    各位朋友,指教下!
      

  8.   

    BOOL CMyWnd::OnEraseBkgnd(CDC* pDC) 

         return TRUE; 
         // return CWnd::OnEraseBkgnd(pDC);  // 注释掉默认语句
    }
    试一试
     
      

  9.   

    if (0 == nIDEvent)
      {
      rc1.left += 8;
      rc2.left += 8;
      rc3.left += 8;
      rc1.right += 8;
      rc2.right +=8;
      rc3.right += 8;
      m_bt1.MoveWindow(rc1);
      m_bt2.MoveWindow(rc2);
      m_bt3.MoveWindow(rc3);
    // m_bt1.Invalidate();
    // m_bt2.Invalidate();
    // m_bt3.Invalidate();
    //  RedrawWindow();//去掉这句
        InvalidateRect(rc1);//加上这句,如果刷新区域过小,就再适当增大点
      m_iCount++;
      if(m_iCount>20)
      {
      KillTimer(0);
      }
      }
      CDialog::OnTimer(nIDEvent);
      

  10.   

    chrome里有一个类 tween(有线性,快进慢出等) 把它抠出来 或者你自己写个平滑的算法 然后在计时器或线程里setwindowpos
      

  11.   

    enum Type
        {
            LINEAR,        // Linear.
            EASE_OUT,      // Fast in, slow out (default).
            EASE_IN,       // Slow in, fast out.
            EASE_IN_OUT,   // Slow in and out, fast in the middle.
            FAST_IN_OUT,   // Fast in and out, slow in the middle.
            EASE_OUT_SNAP, // Fast in, slow out, snap to final value.
            ZERO,          // Returns a value of 0 always.
        };// static
    double Tween::CalculateValue(Tween::Type type, double state)
    {
    ASSERT(state >= 0 && state <= 1);    switch(type)
        {
        case EASE_IN:
            return pow(state, 2);    case EASE_IN_OUT:
            if(state < 0.5)
            {
                return pow(state * 2, 2) / 2.0;
            }
            return 1.0 - (pow((state - 1.0) * 2, 2) / 2.0);    case FAST_IN_OUT:
            return (pow(state - 0.5, 3) + 0.125) / 0.25;    case LINEAR:
            return state;    case EASE_OUT_SNAP:
            state = 0.95 * (1.0 - pow(1.0 - state, 2));
            return state;    case EASE_OUT:
            return 1.0 - pow(1.0 - state, 2);    case ZERO:
            return 0;
        }    ASSERT(FALSE);
        return state;
    }// static
    double Tween::ValueBetween(double value, double start, double target)
    {
        return start + (target - start) * value;
    }// static
    int Tween::ValueBetween(double value, int start, int target)
    {
        if(start == target)
        {
            return start;
        }
        double delta = static_cast<double>(target - start);
        if(delta < 0)
        {
            delta--;
        }
        else
        {
            delta++;
        }
        return start + static_cast<int>(value * _nextafter(delta, 0));
    }
      

  12.   

    楼主一定要用CButton吗?有这功夫不如自己画6个矩形
      

  13.   

    额,楼主画矩形当作按钮,用FillSoildRect画6个矩形,并通过TextOut在上面写上文字,然后就是每次重画的时候改变其坐标就好了,按钮点击可以响应鼠标左击消息,然后判断是否在矩形(按钮)内