使用 SetWindowPos 移动窗口是“正常方式”吗?

Ren*_*ger 5 windows winapi

我想知道,为了将带有 Win32 API 的 (ms-windows-) 窗口向右移动 20 像素,向下移动 40 像素,以下函数调用是如何执行的:

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

我问是因为在我看来可能有一个函数只将 aHWND和 an xandy作为参数。

In *_*ico 5

是的,这几乎就是这样做的。您应该更喜欢使用,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个MoveWindow()功能几乎可以做同样的事情。有了SetWindowPos()可用的功能,它现在更像是一个方便的功能,而不是其他任何东西


And*_*ers 5

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

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

  • @mikew 不,使用 SWP_NOZORDER (2认同)