【问题标题】:Questions regarding GetWindowPlacement return data关于 GetWindowPlacement 返回数据的问题
【发布时间】:2019-06-23 16:17:53
【问题描述】:

我有点不确定调用 GetWindowPlacement() 函数的某些返回值的含义,所以我希望得到您的帮助。

我将调用它来获取隐藏窗口的正常尺寸。

首先,showCmd 字段的值从何而来?在返回结构 (WINDOWPLACEMENT structure) 的 Microsoft 文档中,所有可能值的描述都使用动词/动作词;例如,“SW_MAXIMIZE:最大化指定的窗口”或“SW_SHOWNOACTIVATE:以最近的大小显示一个窗口并且位置。”

我想在不先取消隐藏/恢复它的情况下获取隐藏窗口的尺寸,因此对于动词,我似乎必须在调用 GetWindowPlacement 之前调用 SetWindowPlacement() 并将 showCmd 设置为 SW_SHOWNOACTIVATE。对吗?

那么我是否正确理解该字段获取其各种值的主要(也许是唯一)方式是通过在某处显式调用 SetWindowPlacement()?

我的第二个问题与 rcNormalPosition 返回值有关。这些数据是否包括窗口装饰,或者它们是客户价值?

感谢您的宝贵时间!

【问题讨论】:

  • 我会说改用 GetWindowRect()。
  • 但是迈克尔,这对隐藏窗口有效吗?
  • 我已经找到了第二个问题的答案,所以你可以忽略这部分。
  • @Amby131 它适用于隐藏窗口,但不适用于最小化窗口。对于最小化的窗口,您仍然需要为historical reasons 调用GetWindowPlacement()

标签: winapi window-position


【解决方案1】:

WINDOWPLACEMENT 结构的showCmd 成员的含义有点令人困惑,因为 Win32 正在重用 ShowWindow() 使用的 SW_* 命令。

幸运的是,GetWindowPlacement() 函数中记录了其含义。

如果由 hWnd 参数标识的窗口最大化,则 showCmd 成员是 SW_SHOWMAXIMIZED。如果窗口最小化, showCmd 是 SW_SHOWMINIMIZED。否则为 SW_SHOWNORMAL。

因此,根据返回的这 3 个值中的哪一个,您可以判断窗口当前是最大化、最小化还是正常(恢复)。如果您想知道正常位置是什么,您可以使用rcNormalPosition 成员。你根本不需要打电话给SetWindowPlacement()

但是,请注意GetWindowPlacement() 返回工作区 坐标而不是屏幕 坐标的警告,后者因任务栏位置和大小而异。如果您只使用GetWindowPlacement() 返回的坐标调用SetWindowPlacement(),这不是问题。否则,您可能必须找到一种将工作区坐标转换为屏幕坐标的方法。

【讨论】:

  • 非常感谢@Sean Cline。这很有帮助,但由于我的新手,我缺乏投票的能力。
  • 另请注意,GetWindowPlacement 仅在窗口样式包含 WS_EX_TOOLWINDOW 时返回工作区坐标。大多数标准的顶级窗口不包括这个。
【解决方案2】:

我发现这 2 个函数对我有用。

void MyDialog::LoadDialogPlacement()
{
    static WINDOWPLACEMENT last_wp = {};
    // Load last stored DB version
    WINDOWPLACEMENT *wp = new WINDOWPLACEMENT;
    GetStoredWindowPlacement(&wp);
    if (memcmp((void *)&last_wp, (const void *)wp, sizeof(WINDOWPLACEMENT)) == 0) return;
    memcpy((void *)&last_wp, (const void *)wp, sizeof(WINDOWPLACEMENT));
    SetWindowPlacement(wp);
    delete[] wp;

}
void MyDialog::SaveDialogPlacement()
{
    static WINDOWPLACEMENT last_wp = {};

    if (IsWindowVisible())
    {
        WINDOWPLACEMENT wp = {};
        wp.length = sizeof(WINDOWPLACEMENT);
        GetWindowPlacement(&wp);
        if (memcmp((void *)&last_wp, (const void *)&wp, wp.length) == 0) return;
        memcpy((void *)&last_wp, (const void *)&wp, wp.length);
        StoreWindowPlacement(&wp);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-13
    • 2021-03-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多