SetWindowPlacement 对于“rcNormalPosition”成员似乎无法正常工作

问题描述 投票:0回答:1

我正在开发 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;
}

我遗漏了什么或做错了什么吗?

c++ winapi
1个回答
0
投票

GetWindowPlacement手册页说:

在调用 GetWindowPlacement 之前,将 length 成员设置为

sizeof(WINDOWPLACEMENT)

你不这样做。你应该这样做:

case WM_DESTROY:
{
    WINDOWPLACEMENT placement = {
        .length = sizeof(WINDOWPLACEMENT)
    };
    GetWindowPlacement(hwnd, &placement);
    SetMainWindowPlacement(placement);
    PostQuitMessage(0);
    return 0;
}

此初始化还将结构体的所有其他成员清零,以便您在成员中找不到任何剩余的垃圾。

© www.soinside.com 2019 - 2024. All rights reserved.