0

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

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

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

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

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

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

感谢您的时间!

4

2 回答 2

3

showCmdstruct成员的含义WINDOWPLACEMENT有点混乱,因为 Win32 正在SW_*重用ShowWindow().

幸运的是,函数的含义记录在案GetWindowPlacement()

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

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

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

于 2019-06-23T17:09:38.107 回答
0

我发现这两个功能对我有用。

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);
    }

}
于 2020-09-05T21:23:22.207 回答