【问题标题】:C++ Animating a button with MoveWindow()C++ 使用 MoveWindow() 为按钮设置动画
【发布时间】:2015-11-26 16:55:22
【问题描述】:

我是 C++ 新手,似乎被卡住了。我基本上有一个窗口和一个按钮(也是用 CreateWindow() 创建的)。我想让按钮在 X 轴上移动,我尝试使用 MoveWindow() 但我似乎无法制作动画效果。我尝试在 for 循环中编写它,但我还没有找到用来延迟动画的方法。我将不胜感激。

for (int i = 0; i < 50; i++) {
     MoveWindow(g_MovingDot, i, ButtonTop, ButtonWidth, ButtonHeight, true);
     //Delay it somehow
}

这是正确的做法吗?我只是想让按钮慢慢向右移动。

【问题讨论】:

    标签: c++ animation winapi window


    【解决方案1】:

    使用SetTimer 函数在超时值到期时得到通知。

    用签名实现一个函数

    VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
    

    并将函数指针传递给SetTimer,以注册回调过程。

    使用全局控制变量,控制窗口的动画。在下面的代码 sn-p 中,控制变量被命名为i_g
    当计时器结束时,调用回调过程。增加控制变量,稍微移动对话框元素并重新启动计时器,直到到达最终位置。
    动画时间由动画步数和单步时间间隔控制。

    int g_i=0;
    
    void CALLBACK BtnTimer( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
    {
        KillTimer( hwnd, idEvent );
        if ( g_i < 50 )
        {
          MoveWindow(g_MovingDot, i, ButtonTop, ButtonWidth, ButtonHeight, true);
          g_i ++;
          SetTimer( hwnd, idEvent, 100 /* time milliseconds */, &BtnTimer );
        }
    }
    
    void AnimateButton( HWND hDialogWnd //* HWND from Dialog */)
    {
        g_i = 0;
        SetTimer( hDialogWnd, 0 /* idEvent */, 100 /* time milliseconds */, &BtnTimer );    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多