我正在开发 Win32 C++ 应用程序。我正在尝试保持窗口的边界和最大化/最小化/正常状态。
在窗口的
WM_DESTROY
处理程序中,我获取窗口的 WINDOWPLACEMENT
结构并将其存储在注册表中。
在窗口的
WM_CREATE
处理程序中,我正在检索之前保存的 WINDOWPLACEMENT
结构并用它调用 SetWindowPlacement()
。如果保存结构时窗口没有最大化或最小化,则一切都会按预期工作。
但是,如果窗口最小化或最大化,窗口会按预期最小化或最大化,但不会恢复到正确的位置。如果窗口已最大化,则单击恢复按钮可使窗口保持相同大小。
以下是我创建的用于保存结构的函数的声明:
[[nodiscard]] std::optional<WINDOWPLACEMENT> GetMainWindowPlacement();
void SetMainWindowPlacement(const WINDOWPLACEMENT& placement);
WM_DESTROY
处理程序:
case WM_DESTROY:
{
WINDOWPLACEMENT placement;
GetWindowPlacement(hwnd, &placement);
SetMainWindowPlacement(placement);
PostQuitMessage(0);
return 0;
}
WM_CREATE
处理程序:
case WM_CREATE:
{
auto placement = GetMainWindowPlacement();
if (placement.has_value())
{
SetWindowPlacement(hwnd, &placement.value());
}
else
{
const auto screenWidth = GetSystemMetrics(SM_CXMAXIMIZED);
const auto screenHeight = GetSystemMetrics(SM_CYMAXIMIZED);
RECT windowRect;
GetWindowRect(hwnd, &windowRect);
const auto windowWidth = windowRect.right - windowRect.left;
const auto windowHeight = windowRect.bottom - windowRect.top;
const auto x = (screenWidth - windowWidth) / 2;
const auto y = (screenHeight - windowHeight) / 2;
SetWindowPos(hwnd, nullptr, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
ShowWindow(hwnd, SW_SHOWDEFAULT);
}
return 0;
}
我遗漏了什么或做错了什么吗?
GetWindowPlacement的手册页说:
在调用 GetWindowPlacement 之前,将 length 成员设置为
。sizeof(WINDOWPLACEMENT)
你不这样做。你应该这样做:
case WM_DESTROY:
{
WINDOWPLACEMENT placement = {
.length = sizeof(WINDOWPLACEMENT)
};
GetWindowPlacement(hwnd, &placement);
SetMainWindowPlacement(placement);
PostQuitMessage(0);
return 0;
}
此初始化还将结构体的所有其他成员清零,以便您在成员中找不到任何剩余的垃圾。