我想知道,为了将带有 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作为参数。
是的,这几乎就是这样做的。您应该更喜欢使用,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()可用的功能,它现在更像是一个方便的功能,而不是其他任何东西。
是的,这是正常的方式,窗口会收到一条WM_WINDOWPOSCHANGING消息(带有更改的参数)还有较旧的方式MoveWindow,但它不太灵活,实际上会强制您设置大小。
要正确保存和恢复窗口大小,您应该分别使用GetWindowPlacement和SetWindowPlacement。