我知道MoveWindow()和SetWindowPos()函数。我知道如何正确使用它们。但是,我要完成的是缓慢且平滑地移动窗口,就像用户在拖动它一样。

我尚未使它正常工作。我尝试的是使用GetWindowRect()获取当前坐标,然后使用setwindow和movewindow函数,每次调用将Right增加10个像素。

有任何想法吗?

这是我所有定义之外的内容。

while(1)
{
     GetWindowRect(notepad,&window);

     Sleep(1000);
     SetWindowPos(
        notepad,
        HWND_TOPMOST,
        window.top - 10,
        window.right,
        400,
        400,
        TRUE
        );
}

最佳答案

如果想要平滑的动画,则需要使其基于时间,并允许Windows处理两次运动之间的消息。 Set a timer,并从动画开始以来通过根据WM_TIMER notifications移动窗口一定距离来响应elapsed time。对于看起来自然的运动,请不要使用线性函数来确定距离-而是尝试使用Robert Harvey's建议的函数。

伪代码:

//
// animate as a function of time - could use something else, but time is nice.
lengthInMS = 10*1000; // ten second animation length
StartAnimation(desiredPos)
{
   originalPos = GetWindowPos();
   startTime = GetTickCount();
   // omitted: hwnd, ID - you'll call SetTimer differently
   // based on whether or not you have a window of your own
   timerID = SetTimer(30, callback);
}

callback()
{
   elapsed = GetTickCount()-startTime;
   if ( elapsed >= lengthInMS )
   {
      // done - move to destination and stop animation timer.
      MoveWindow(desiredPos);
      KillTimer(timerID);
   }

   // convert elapsed time into a value between 0 and 1
   pos = elapsed / lengthInMS;

   // use Harvey's function to provide smooth movement between original
   // and desired position
   newPos.x = originalPos.x*(1-SmoothMoveELX(pos))
                  + desiredPos.x*SmoothMoveELX(pos);
   newPos.y = originalPos.y*(1-SmoothMoveELX(pos))
                  + desiredPos.y*SmoothMoveELX(pos);
   MoveWindow(newPos);
}

关于c++ - 如何以编程方式缓慢地移动窗口,就像用户正在做的那样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/932706/

10-09 00:19