有关GetWindowPlacement返回数据的问题

时间:2019-06-23 16:17:53

标签: winapi window-position

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

我将其称为获取隐藏窗口的正常尺寸。

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

我想获取隐藏窗口的尺寸而不先取消隐藏/还原,所以使用动词似乎必须在调用GetWindowPlacement之前将showCmd设置为SW_SHOWNOACTIVATE的情况下调用SetWindowPlacement()。正确吗?

所以我能正确理解字段获得其各种值的主要(也许唯一)方法是在某处显式调用SetWindowPlacement()吗?

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

谢谢您的时间!

2 个答案:

答案 0 :(得分:3)

showCmd结构的WINDOWPLACEMENT成员的含义有点混乱,因为Win32重用了ShowWindow()使用的SW_*命令。

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

  

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

因此,基于这三个值中的哪一个,您可以判断窗口当前是最大化,最小化还是正常(还原)。而且,如果您想知道常规位置是什么,可以使用rcNormalPosition成员。您完全不需要致电SetWindowPlacement()

不过,请注意GetWindowPlacement()返回 workspace 坐标而不是 screen 坐标的警告,该坐标根据任务栏的位置和大小而有所不同。如果仅使用GetWindowPlacement()返回的坐标来调用SetWindowPlacement(),就没有问题。否则,您可能必须找到一种将工作空间转换为屏幕坐标的方法。

答案 1 :(得分: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);
    }

}