用SetWindowPos移动一个窗口是“常规方式”吗?

时间:2011-01-08 01:03:30

标签: windows winapi

我想知道,为了将Win32 API 20 px向右移动(ms-windows-)窗口向下移动40 px,以下 函数调用将是如何做到的:

SetWindowPos(
  /* hWnd             */  hChildDlg2, 
  /* hWndInsertAfter  */ (HWND) -1,
  /* X                */ 20,
  /* Y                */ 40,
  /* cx               */ -1,
  /* cy               */ -1,
  /* uFlags           */  SWP_NOSIZE |  // Ignore cx, cy
                          SWP_NOZORDER  // and hWndInsertAfter
);

我问,因为在我看来,可能只有HWND以及xy作为参数的功能。

3 个答案:

答案 0 :(得分:4)

是的,这几乎就是它的完成方式。您应该更喜欢使用SetWindowPos(),因为它可以让您对窗口的移动/调整大小有很大的控制。

我通常像这样使用它(我写的一个小框架的一部分):

// Window member function
void Window::Move(int x, int y)
{
    if(hwnd != 0)
    {
        ::SetWindowPos(hwnd, 0, x, y, 0, 0, 
            SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
    }
}

还有一个MoveWindow()函数可以完成同样的功能。使用SetWindowPos()功能,it's now more of a convenience function than anything else

答案 1 :(得分:1)

是的,这是正常的方式,窗口会收到WM_WINDOWPOSCHANGING消息(参数已更改)还有较旧的MoveWindow,但它不太灵活,实际上会强制您设置大小。

要正确保存和恢复窗口大小,您应分别使用GetWindowPlacementSetWindowPlacement

答案 2 :(得分:0)

你的意思是MoveWindow

它需要hwnd,x,y,width,height,因为没有SWP_NOSIZE标志,使用它来移动窗口实际上更复杂,因为你还需要获取大小。

相关问题