如何在MFC中的应用程序中重新排序窗口

时间:2016-01-12 19:56:34

标签: c++ mfc

我们假设在软件中打开了几个不同的Windows(CWnd),并且所有活动窗口的指针都保存在std::vector<Node> tabsInfo中。以下是Node的部分代码:

struct typedef Node {
...
CWnd *pWnd;
...
}

我有一个处理程序来使用tabsInfo更新所有活动窗口的Z顺序,如下所示:

for (size_t i = tabsInfo.size(); i > 1; i--) {
        Node *pN_cur = &tabsInfo.at(i - 1);
        Node *pN_next = &tabsInfo.at(i - 2);
        ret = pN_cur->pWnd->SetWindowPos(pN_next->pWnd, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
        ASSERT(ret != 0); // Sanity check
    }

但是,当我调试它们时,即使它们运行没有错误,它也不会改变所有窗口的顺序。

我是否误解了如何使用SetWindowPos? 当我看到其他问题得到解答时(处理对话框中的按钮而不是窗口),他们给出了类似的解决方案,但它似乎无法在这里工作。

1 个答案:

答案 0 :(得分:0)

对于遇到同样问题的人,我添加了几行,并且有效:

for (int i = tabsInfo.size() - 1; i >= 0; i--) {
        Window_Node *pWN = &tabsInfo.at(i);
        if (tabsInfo.at(i).checked) { // Ignore this line. This is program-specific
            WINDOWPLACEMENT wp = {};
            wp.length = sizeof(WINDOWPLACEMENT);
            pWN->pWnd->GetParentFrame()->GetWindowPlacement(&wp);
            wp.showCmd=SW_RESTORE;                                                                                   
            pWN->pWnd->GetParentFrame()->SetWindowPlacement(&wp);
            ret = pWN->pWnd->GetParentFrame()->SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
            ASSERT (ret != 0);
        } else {
        pWN->pWnd->GetParentFrame()->ShowWindow(SW_MINIMIZE);
        }
    }
}

希望它可以帮助某人:)